1. 程式人生 > >少說話多寫程式碼之Python學習047——類的成員(呼叫父類建構函式)

少說話多寫程式碼之Python學習047——類的成員(呼叫父類建構函式)

前面我們知道了在Python中如何繼承。我們看下面的繼承關係,Bird類有一個eat方法。BigBird繼承了Bird,並且新增了sing方法。

class Bird:
    def __init__(self):
        self.hungry=True

    def eat(self):
        if self.hungry:
            print('開始吃,好好吃...')
            self.hungry=False
        else:
            print('吃飽了,不要了...')

b= Bird()
b.eat();
b.eat()

輸出

開始吃,好好吃...
吃飽了,不要了...

子類,

class BigBird(Bird):
    def __init__(self):
        self.sound='小燕子,穿花衣,年年春天來這裡...'
    def sing(self):
        print(self.sound)

bg = BigBird()
bg.sing()
bg.eat()

呼叫sing方法輸出

小燕子,穿花衣,年年春天來這裡...

呼叫eat報異常如下:

Traceback (most recent call last):
  File "D:/work/Python/ClassElement2.py", line 27, in <module>
    bg.eat()
  File "D:/work/Python/ClassElement2.py", line 9, in eat
    if self.hungry:
AttributeError: 'BigBird' object has no attribute 'hungry'

因為BigBird中沒有呼叫父類Bird中的建構函式,所以沒有初始化父類的hungry的值。如果想要eat方法能正常執行,我們需要在BigBird的建構函式中呼叫父類的建構函式。
如下,

class BBigBird(Bird):
    def __init__(self):
        Bird.__init__(self)
        self.sound='小燕子,穿花衣,年年春天來這裡...'
    def sing(self):
        print(self.sound)

bg = BBigBird()
bg.sing()
bg.eat()

輸出

小燕子,穿花衣,年年春天來這裡...
開始吃,好好吃...

因為在呼叫一個例項的方法時,該方法的self引數會被自動繫結到例項上。上面這種直接呼叫類的方法,比如Bird.__init__(self),其實沒有例項繫結。這樣的方法是未繫結的。
上面例子中,將當前BBigBird的例項作為self引數提供給未繫結的方法Bird.__init__,BBigBird就能夠使用父類的建構函式,hungry會被賦值。

 

工程檔案下載:https://download.csdn.net/download/yysyangyangyangshan/10797322