Python多重繼承的方法解析執行順序例項分析

2022-09-29 16:09:15 字數 1488 閱讀 7160

任何實現多重繼承的語言都要處理潛在的命名衝突, 這種衝突由不相關的祖先類實現同名方法引起

class a:

def say(self):

print("a hello:", self)

class b(

def eat(self):

print("b eating:", self)

class c(a):

def eat(self):

print("c eating:", self)

class d(b, c):

def say(self):

super().say()

print("d hello:", self)

def dinner(self):

self.say()

super().say()

self.eat()

super().eat()

c.eat(self)

這裡b和c都實現了eat方法,

在 d 的例項上呼叫 d.eat() 方法的話, 執行的是哪個 eat 方法呢?

>>> d = d()

>>> d.eat()

b eating: <__main__.d object at>

>>> c.eat(d)

c eating: <__main__.d object at>

超類中的方法都可以直接呼叫, 此時要把例項作為顯式引數傳入

python 能區分 d.eat() 呼叫的是哪個方法, 是因為 python 會按照特定的順序遍歷繼承圖。 這個順序叫方法解析順序( method resolution order, mro)。 類都有乙個名為 __mro__ 的屬性, 它的值是ehvdkrnx乙個元組, 按照方法解析順序列出各個超類, 從當前類一直向上, 直到object 類。 d 類的 __mro__ 屬性如下 :

>>> d.__mro__

(, , , )

>>>ehvdkrnx; d = d()

>>> d.dinner()

a hello: <__main__.d object at>

d hello程式設計客棧: <__main__.d object at>

a hello: <__main__.d object at>

b eating: <__main__.d object at>

b eating: <__main__.d object at>

c eating: <__main__.d object at>

第乙個self.say(),執行a類的say()再print出自己的第二行資訊

第二個super().say(),執行a類的say()

第三個self.eat(),根據__mro__, 找到的是 b 類實現的eat方法

第四個super().eat(),根據__mro__, 找到的是 b 類實現的eat方法

第五個c.eat(self)忽略 mro , 找到的是 c 類實現的eat方法

python 多重繼承的方法解析順序

任何實現多重繼承的語言都要處理潛在的命名衝突,這種衝突由不相關的祖先類實現同名方法引起 這裡b和c都實現了eat方法,在 d 的例項上呼叫 d.eat 方法的話,執行的是哪個 eat 方法呢?d d d.eat b eating main d object at 0x7fb90c627f60 c.e...

python的多重繼承

在設計類的繼承關係時,通常,主線都是單一繼承下來的,如果需要 混入 額外的功能,通過多重繼承就可以實現,這種設計通常稱之為mixin。class animal object pass class mammal animal pass class runnable object def run sel...

python的多重繼承

python和c 一樣,支援多繼承。概念雖然容易,但是困難的工作是如果子類呼叫乙個自身沒有定義的屬性,它是按照何種順序去到父類尋找呢,尤其是眾多父類中有多個都包含該同名屬性。對經典類和新式類來說,屬性的查詢順序是不同的。現在我們分別看一下經典類和新式類兩種不同的表現 經典類 usr bin pyth...