面向对象的继承 2

super关键字应用


lass Animal: # 动物
    def __init__(self,name,aggr,hp):  #方法 动态属性  内置的双下方法
        self.name = name    # 对象属性 实例属性
        self.aggr = aggr
        self.hp = hp
    def eat(self):
        print('in Animal eat')

class Person(Animal):    # 类名 Person
    def __init__(self,name,sex,aggr,hp):
        self.sex = sex   # 派生属性
        # Animal.__init__(self,name,aggr,hp)
        super().__init__(name,aggr,hp)
        # 单继承中 super会寻找父类
        # 且在使用super调用父类方法的时候不需要再传self参数
    def eat(self):
        print('in Person eat')
        Animal.eat(self)      #alex.eat()=Person.eat(alex)
        # super().eat()
alex = Person('alex','不详',1,250)
print(alex.__dict__)
# Animal.eat(alex)
# super(Person,alex).eat()

注意:

第一个要注意:

Animal.eat(self) 与  super().eat() 在person类中def eat()直接饮用

所以super().eat()中super后面括号可以省略

而我们如果在外面调用的时候,括号里面不能直接省略(super(Person,alex).eat())

第二个要注意:

alex.eat()=Person.eat(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):pass
    # def wahaha(self):print('in D')

d = D()
d.wahaha()

# 不要发生循环继承
# 依赖倒置原则 :
# 高层模块不应该依赖低层模块

注意:

1如果调用子类属性,子类没有找父类,以此类推,不断找父类。

2不能发生循环继承

3 依赖倒置原则,高层模块(D也就是最里层)不应该依赖低层模块(A最外层)

简单的多继承

class A:pass
    # def qqxing(self):
    #     print('in A')

class B:
    def qqxing(self):
        print('in B')

class C:
    def qqxing(self):
        print('in C')

class D(B,A,C):
    pass
    # def qqxing(self):
    #     print('in D')

d = D()
d.qqxing()

按照D(B,A,C)按照BAC顺序查找,如果一个出现Pass,往上找

注意:Python3中所有的类继承object

新式类:一个类继承object

经典类:一个类没有继承object

经典类没有mro方法,新式类有

Python3才有super

笔记如下:

猜你喜欢

转载自my.oschina.net/u/3648651/blog/1809178