面向對象繼承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()

注意:spa

第一個要注意:對象

Animal.eat(self) 與  super().eat() 在person類中def eat()直接飲用繼承

因此super().eat()中super後面括號能夠省略it

而咱們若是在外面調用的時候,括號裏面不能直接省略(super(Person,alex).eat())class

 

第二個要注意:object

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()

# 不要發生循環繼承
# 依賴倒置原則 :
# 高層模塊不該該依賴低層模塊

注意:im

1若是調用子類屬性,子類沒有找父類,以此類推,不斷找父類。qq

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

 

筆記以下:

 

 

相關文章
相關標籤/搜索