python之路 面向对象(一)
面向过程vs面向对象
面向过程的核心是过程,是解决问题的步骤。
优点:极大降低了写程序的复杂度,只需顺着要执行的步骤,码代码即可。
缺点:一套程序解决一个问题,牵一发动全身。
面向对象的核心是对象。
优点:解决了程序的扩展性,对某一个单一对象的修改,会映射到整个体系中。
缺点:可控性差,无法向面向过程一样可以很精准的预测到结果,面向对象程序一旦开始就由对象之间的交互解决问题,无法预测结果。
类和对象(实例)
python中一切皆对象,类型的本质就是类,包括字典,列表,数字,字符串等。
在python中,用变量表示特征,用函数表示方法,具有相同特征和方法的一类事物即使“类”,对象就是类中具体的一个。
类
定义一个类
class Class_name: #class关键字,类名手字母大写,后跟冒号 pass
声明类
class Person: role = "person"#属性 静态属性 def walk(self): print("person is walking...")#方法 动态属性
类的两种作用:属性引用和实例化
属性引用(类名. 属性)
class Person: role = "person"#属性 静态属性 def walk(self): print("person is walking...")#方法 动态属性 print(Person.role)#查看role的属性 print (Person.walk)#引用人的walk方法
实例化: 类名加括号就是实例化,自动触发__inti__方法的运行,可以使用它来为每个实例定制自己的特征。
class Person: role = "person"#属性 静态属性 def __init__(self,name): self.name = name def walk(self): print("person is walking...")#方法 动态属性 print(Person.role) print (Person.walk)
实例化就是类产生对象的过程。
特殊的类属性
二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
对象是关于类实际存在的一个例子,即实例,对象只有一种作用,属性引用
class Person: '''定义一个关于人的类''' role = "person"#属性 静态属性 def __init__(self,name,aggr,life_value): self.name = name self.aggr = aggr self.life_value = life_value def attack(self,dog): dog.life_value -= self.aggr egg = Person("egon",100,1000) # 属性引用 print(egg.name) print(egg.aggr) print(egg.life_value)
用函数来解释这个类:
def Person(*args,**kwargs): self = {} def __init__(name,aggr,life_value): self["name"] = name self["aggr"] = aggr self["life_value"] = life_value return self return __init__(*args,**kwargs) egg = Person("egon",10,20) print(egg)
定义及调用的固定模式
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可 小结
对象交互:
class Person:#定义一个人类 role = "中国人" def __init__(self,name,life_value,aggr): self.name = name self.life_value = life_value self.aggr = aggr def attack(self,dog): dog.life_value -= self.aggr class Dog:#定义一个够类 def __init__(self,name,life_value,aggr): self.name = name self.life_value = life_value self.aggr = aggr def bite(self,person): person.life_value -= self.aggr egg = Person("egon",500,50) dog = Dog("泰迪",20000,500) # egon攻击狗,狗的生命值少了50 print(dog.life_value) egg.attack(dog) print(dog.life_value) # 狗咬egon,egon的生命值少了66 print(egg.life_value) dog.bite(egg) print(egg.life_value) # egg 有了200块钱买装备 egg.money = 200 class Weapon:#定义一个武器类 def __init__(self,name,price,aggr,life_value,attack_force): self.name = name self.price = price self.life_value = life_value#生命加成 self.attack_force = attack_force#攻击力 self.aggr = aggr#伤害加成 def Update(self,person):#带装备 person.money -= self.price person.life_value += self.life_value person.aggr += self.aggr def Kill(self,obj):#obj代表被攻击对象 大招 obj.life_value -= self.attack_force 打狗棍 = Weapon("打狗棍",199,50,50,10000) if egg.money > 打狗棍.price: 打狗棍.Update(egg) egg.Weapon = 打狗棍 #egon的攻击力和生命值都增加了50 print(dog.life_value) print(egg.life_value) egg.attack(dog) print(dog.life_value) #egon放大招了,狗的生命值减少10000 print(dog.life_value) print(egg.life_value) egg.Weapon.Kill(dog) print(dog.life_value)
类命名空间与实例命名空间
创建一个类的时候就会创建一个类的名称空间
静态属性就是直接在类中定义的变量
动态属性就是定义在类中的方法
类的数据是共享给所有的对象的
而类的动态属性是绑定到所有的对象的
创建一个实例就会创建一个对象/实例的名称空间,存放对实例的名字,称为实例的属性