python面向对象(类的继承)
一. 继承的初识
在python3中 所有的类都继承自object
class ParentClass1: pass class ParentClass2: pass class ChildClass(ParentClass1):pass #单继承 class ChildClass1(ParentClass1,ParentClass2):pass #多继承 print(ParentClass1.__base__) print(ChildClass.__base__) #会显示该类的一个父类 print(ChildClass1.__base__) print(ChildClass.__bases__) print(ChildClass1.__bases__) #会显示该类的所有父类
二. 人狗大战
class Animal: def __init__(self,name,aggr,hp): self.name = name self.aggr = aggr self.hp = hp def eat(self): print('in Animal') class Person(Animal): def __init__(self,name,sex,aggr,hp): self.sex = sex # Animal.__init__(self,name,aggr,hp) super().__init__(name,aggr,hp) def attack(self,dog): print('%s打了%s'%(self.name,dog.name)) dog.hp -= self.aggr print(dog.hp) def eat(self): print('in Person') # Animal.eat(self) # super().eat() class Dog(Animal): def __init__(self,name,kind,aggr,hp): self.sex = kind # Animal.__init__(self, name, aggr, hp) super().__init__(name,aggr,hp) def bite(self, person): print('%s咬了%s'%(self.name, person.name)) person.hp -= self.aggr print(person.hp) alex = Person('alex','felame',1,250) hei = Dog('小黑','teddy',260,10000) alex.attack(hei) hei.bite(alex) # alex.eat() Person.eat(alex) Animal.eat(alex) super(Person,alex).eat()
三. 单继承
不要发生循环继承
依赖倒置原则 :
高层模块不应该依赖低层模块
class A: def wahaha(self):print('in A') class B(A): def wahaha(self):print('in B') class C(B): def wahaha(self):print('in C') class D(C): def wahaha(self):print('in D') d = D() d.wahaha()
三. 多继承及钻石继承
python3中的所有类 都默认继承object
如果一个类 继承了object 这个类就被称为新式类
没有继承object类 就被称为经典类
深度优先 广度优先 都是一种遍历算法,把这个图中所有的项都走一遍,且不会重复
经典类 遵循 深度优先算法 且没有mro方法 python2
新式类 遵循 广度优先算法 有mro方法 py2 py3
py3 super
单继承中 super就是找父类
多继承 super寻找的轨迹是根据mro(广度优先)顺序的
class A: def wangwang(self): print('in A') class B(A): def wangwang(self): super().wangwang() # 'in C ' print('in B') class C(A): def wangwang(self): print('in C') class D(B,C):pass d = D() d.wangwang()