一、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-hant/n/186705.html
微信掃一掃
支付寶掃一掃