前言:
super() 函數是用於調用父類(超類)的一種方法,具體可點擊這裏查看。
示例代碼:
1.創建兩個單獨的類;
類Bird實現所有鳥的基本能力:進食。第一次進食輸出“Aaaah...”;第二次進食輸出“No,thanks!”
類SongBird實現鳥的部分能力:唱歌。調用song函數輸出"squawk!"
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('Aaaah...')
self.hungry = False
else:
print("No,thanks!")
class SongBird:
def __init__(self):
self.sound = 'Squawk!'
def sing(self):
print(self.sound)
a = Bird()
a.eat()
a.eat()
b = SongBird()
b.sing()
結果: Aaaah... No,thanks! Squawk!
2.創建兩個類,其中子類調用父類。
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('Aaaah...')
self.hungry = False
else:
print("No,thanks!")
class SongBird(Bird):
def __init__(self):
self.sound = 'Squawk!'
def sing(self):
print(self.sound)
b = SongBird()
b.sing()
b.eat()
結果:
Squawk!
Traceback (most recent call last):
File "/media/zhangwentao/DATA1/Documents2/tensorflow2.0/CNN/003.py", line 27, in <module>
b.eat()
File "/media/zhangwentao/DATA1/Documents2/tensorflow2.0/CNN/003.py", line 7, in eat
if self.hungry:
AttributeError: 'SongBird' object has no attribute 'hungry'
問題分析:
因爲在SongBird中重寫了構造函數,但新的構造函數沒有包含任何初始化屬性hungry的代碼。
解決方法:
①調用未關聯的超類構造函數;②使用函數super
3.修改後的代碼:
class Bird:
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('Aaaah...')
self.hungry = False
else:
print("No,thanks!")
class SongBird(Bird):
def __init__(self):
Bird.__init__(self) # ①調用未關聯的超類構造函數
# super().__init__() # ②使用super函數
self.sound = 'Squawk!'
def sing(self):
print(self.sound)
b = SongBird()
b.sing()
b.eat()
b.eat()
結果:
Squawk!
Aaaah...
No,thanks!
參考資料:
1.python基礎教程(第3版)p147