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版本的解释器中,必须传参数(子类名,子类对象)
原文地址:https://www.cnblogs.com/a352735549/p/8820701.html