少說話多寫程式碼之Python學習047——類的成員(呼叫父類建構函式)
阿新 • • 發佈:2018-11-25
前面我們知道了在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