Day20
1、继承和派生
class Animal: def __init__(self,name,hp,ad): self.name = name # 对象属性 属性 self.hp = hp #血量 self.ad = ad #攻击力 def eat(self): print('eating in Animal') self.hp += 20 class Person(Animal): def __init__(self,name,hp,ad,sex): # 重写 # Animal.__init__(self,name,hp,ad) # super(Person,self).__init__(name,hp,ad) # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self super().__init__(name,hp,ad) # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self self.sex = sex # 派生属性 self.money = 100 def attack(self,dog): # 派生方法 print("%s攻击了%s"%(self.name,dog.name)) def eat(self): # 重写 super().eat() # 在类内 使用 super()方法找父类的方法 print('eating in Person') self.money -= 50 class Dog(Animal): def __init__(self,name,hp,ad,kind): Animal.__init__(self,name,hp,ad) self.kind = kind # 派生属性 def bite(self,person): # 派生方法 print("%s咬了%s" % (self.name, person.name)) # 人 sex alex = Person('alex',100,10,'female') # 实例化 print(alex.__dict__) # 父类有eat 子类没有 # alex.eat() # 找父类的 # 子类有eat 不管父类中有没有 # alex.eat() # 找子类的 # 当子类中有,但是我想要调父类的 # Animal.eat(alex) #指名道姓 # super(Person,alex).eat() # super(子类名,子类对象)方法 —— 一般不用 # 子类父类都有eat方法,我想执行父类的eat和子类的eat alex.eat() # 执行子类的eat print(alex.__dict__) # # 对象 # Person.attack(alex) # alex.attack() # 狗 kind # tg = Dog('到哥',100,50,'藏獒') # print(tg.__dict__)
2、钻石继承问题
# 多继承 class A: def func(self): print('A') class B(A): def func(self): print('B') class C(A): def func(self): print('C') class D(B): def func(self): print('D') class E(B,C): def func(self): print('E') class F(D,E): def func(self): print('F') f = F() f.func() print(F.mro()) # 广度优先的遍历顺序
#新式类 多继承 寻找名字的顺序 遵循广度优先 class A: def func(self): print('A') class B(A): def func(self): super().func() print('B') class C(A): def func(self): super().func() print('C') class D(B,C): def func(self): super().func() # B print('D') d = D() d.func()
# super(): # 在单继承中就是单纯的寻找父类 # 在多继承中就是根据子节点 所在图 的 mro顺序找寻下一个类 # 遇到多继承和super # 对象.方法 # 找到这个对象对应的类 # 将这个类的所有父类都找到画成一个图 # 根据图写出广度优先的顺序 # 再看代码,看代码的时候要根据广度优先顺序图来找对应的super
coding:utf-8 class A: def func(self): print('A') class B(A): def func(self): print('B') class C(A): def func(self): print('C') class D(B,C): def func(self): print('D')
# 经典类 :在python2.*版本才存在,且必须不继承object # 遍历的时候遵循深度优先算法 # 没有mro方法 # 没有super()方法 # 新式类 :在python2.X的版本中,需要继承object才是新式类 # 遍历的时候遵循广度优先算法 # 在新式类中,有mro方法 # 有super方法,但是在2.X版本的解释器中,必须传参数(子类名,子类对象)