函數super使用方法

前言:

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

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