继承与钻石继承

字类继承了父类 那么就是继承了父类中除了私有之外的所有内容,我们可以直接在字类中调用父类的方法或者属性 ,如果是父类中的init内的属性就需要定义在

# 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self

class Animal(object):  #创建一个
    def __init__(self, name, hp,ad):
        self.name =name
        self.hp = hp
        self.ad = ad
    def eat(self):
        print('eat in Animal')

class Person(Animal):  #继承上面的类
    #我们来试着定义一个父类有的属性我们在这个属性中在增加一个属性  比如父类有吃和喝  我们在给字类增加一个睡的属性
    #定义属性就是在一个类中的init方法中 所以我们就需要在init方法中定义
    def __init__(self, name,hp,ad):  #你需要在字类中把父类的属性也定义以便于你父类中的init方法定义的时候可以接收这些
        # Animal.__init__(self, name,hp,ad)
        super(Person,self).__init__(name, hp ,ad) #这个里面前面的括号是默认写的子类 和self
    #再定义一个你字类所单独具备的方法
    def drank(self):
        return '%s在喝'%self.name
        super().eat()


alex = Person('老王', 100, 30)
# print(alex.name) #用来执行类对象alex所继承父类的name属性的姓名
# print(alex.ad)
# super(Person,alex).eat()
super(Person, alex).eat()   #如果子类在外部想直接 调用父类的方法可以通过字类直接调用父类的 也可以通过super()来调用 括号内写上字类名 和字类创建的对象名
alex.eat()  #可以直接用字类创建的对象直接调用父类的方法和父类方法中的属性
#如果父类想直接单独的调用自己的方法直接类名加方法名

如果字类有的方法和属性就不会去查找父类中的而是先去查找自己本类中的

钻石继承:

钻石继承就是多个继承不断的继承

在pytonn3的版本中
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): def func(self): super().func() print('D') class E(B,C): def func(self): super().func() print('E') class F(D,E): def func(self): super().func() print('F') f = F() f.func()

在python中可以用mro来查看钻石继承中所有的信息

python3的版本中都默认继承object所以python3就是新式类 而python2中可以分为经典类和新式类   

python2中的新式类必须手动继承object它遵循深度继承就是一条路走到底,而python2的新式类和python3的新式类一样都是遵循广度优先

python2中的经典类没有mro方法来查看你的经典类的继承关系

在多继承中就是根据子节点 所在图 的 mro顺序找寻下一个类

原文地址:https://www.cnblogs.com/zhaoyunlong/p/8823389.html