一、super()函數的基本用法
Python中的super()函數用於在子類中調用父類的方法,可以省略參數,也可以接受兩個參數:子類和子類對象。使用super()函數調用父類方法的好處是可以避免硬編碼,使得代碼更加靈活。下面是一個簡單的示例代碼:
class Parent: def __init__(self, name): self.name = name def hello(self): print("Hello, " + self.name + "!") class Child(Parent): def __init__(self, name, age): super().__init__(name) self.age = age def hello(self): super().hello() print("I am " + str(self.age) + " years old.") c = Child("Tom", 5) c.hello()
運行結果:
Hello, Tom! I am 5 years old.
在上面的代碼中,子類Child繼承自父類Parent,並重寫了hello方法。在hello方法中,我們使用了super()函數來調用父類的hello方法,使得子類的實例c同時具有了父類和子類的特性。
二、super()函數的多重繼承
Python中的super()函數在多重繼承的場景下,更加能體現它的神奇作用。假設我們有一個基礎的類Animal,還有兩個類Dog和Bird,它們都繼承自Animal類,並且都有自己的方法。現在我們希望創建一個類狗鳥DogBird,讓它同時具有Dog和Bird的特性。下面是一個示例代碼:
class Animal: def __init__(self, name): self.name = name def move(self): print(self.name + " is moving.") class Dog(Animal): def __init__(self, name): super().__init__(name) def bark(self): print(self.name + " is barking.") class Bird(Animal): def __init__(self, name): super().__init__(name) def fly(self): print(self.name + " is flying.") class DogBird(Dog, Bird): def __init__(self, name): super().__init__(name) db = DogBird("Ginger") db.move() db.bark() db.fly()
運行結果:
Ginger is moving. Ginger is barking. Ginger is flying.
在上面的代碼中,我們定義了一個類DogBird,這個類繼承自Dog和Bird兩個類,並且都實現了它們的方法。在這裡,我們只需要調用super()函數,就可以一次性調用它們對應的父類方法。這樣,在多重繼承的場景下,我們就能夠方便地實現代碼的復用和靈活性。
三、super()函數與MRO演算法
Python中的super()函數還與MRO演算法有著密切的關係。MRO全稱為Method Resolution Order,它決定了在多重繼承的情況下,Python中的類方法會按照什麼樣的順序被解析執行。具體來說,MRO演算法的執行順序是廣度優先搜索。
舉個例子,假設我們有一個類D,它繼承自B和C兩個類,而類B和類C又繼承自A類。下面是一個示例代碼:
class A: def __init__(self): print("Init A.") class B(A): def __init__(self): super().__init__() print("Init B.") class C(A): def __init__(self): super().__init__() print("Init C.") class D(B, C): def __init__(self): super().__init__() print("Init D.") d = D()
運行結果:
Init A. Init C. Init B. Init D.
在上面的代碼中,我們定義了類A、類B、類C和類D,它們之間的繼承關係如下圖所示:
在類D中,我們使用了super()函數來調用父類的構造方法。MRO演算法的執行順序是先廣度後深度,所以父類構造方法的執行順序便是A、C、B、D。通過MRO演算法和super()函數,我們就可以輕鬆地實現Python中複雜的多重繼承。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186705.html