python多繼承及其super的用法

python也具有多繼承的功能,而同樣的,大家能想到多繼承必須要引入一些特定的方法來準確調用子類或基類的重載、重寫的方法,否則會出現混亂。
本文參考Multiple inheritance in Python對該問題進行簡要論述。
如下圖描述了一個簡單的類繼承關係
在這裏插入圖片描述
下面是上面類圖的代碼,Class1、Class2、Class3都分別包含一個m方法,

class Class1: 
    def m(self): 
        print("In Class1")  
        
class Class2(Class1): 
    def m(self): 
        print("In Class2") 
  
class Class3(Class1): 
    def m(self): 
        print("In Class3")   
         
class Class4(Class2, Class3): 
    def __init__(self):
    	super(Class4, self).m()  
    	super(Class2, self).m()  
		super(Class3, self).m()  
      
obj = Class4() 

上面代碼的輸出結果爲:

In Class2
In Class3
In Class1

看出區別了嗎,區別就在於super中的第一個參數。python的多繼承通常來說是按順序繼承的,但也不盡然
它的多繼承順序是依據一個叫做**Method Resolution Order (MRO)**的算法來決定的,通過使用類名.mro()可以得到繼承關係的順序。
參考Python Multiple Inheritance中的一個例子
如下圖所示是一個比較複雜的繼承關係圖
在這裏插入圖片描述
其代碼編寫如下

# Demonstration of MRO

class X:
    pass


class Y:
    pass


class Z:
    pass


class A(X, Y):
    pass


class B(Y, Z):
    pass


class M(B, A, Z):
    pass

print(M.mro())

而其輸出結果爲:

[<class '__main__.M'>, <class '__main__.B'>, 
<class '__main__.A'>, <class '__main__.X'>,
<class '__main__.Y'>, <class '__main__.Z'>,
<class 'object'>]

在實際情況中,不可避免地會遇見這種比較複雜的繼承關係,而要弄清楚它們的繼承順序似乎很是麻煩也容易出錯,那麼有沒有辦法直接指定調用某個基類的方法呢?
這當然是可以的。

class Class1: 
    def m(self): 
        print("In Class1")  
        
class Class2(Class1): 
    def m(self): 
        print("In Class2") 
  
class Class3(Class1): 
    def m(self): 
        print("In Class3")   
         
class Class4(Class2, Class3): 
    def __init__(self):
    	Class1.m(self)
    	Class2.m(self)
		Class3.m(self)  
      
obj = Class4() 

輸出結果爲:

In Class1
In Class2
In Class3

即,只需指定繼承的類名,傳入子類對象,即可調用任意指定基類的方法啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章