少說話多寫程式碼之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會被賦值。
工程檔案下載:ofollow,noindex" target="_blank">https://download.csdn.net/download/yysyangyangyangshan/10797322