Python中的super函式
對於初始化函式的繼承,跟一般方法的繼承,還有點不同。 先看下面的例子:
class Person(object): def __init__(self): self.height = 160 def about(self, name): print("{} is about {}".format(name,self.height)) class Girl(Person): def __init__(self): self.breast = 90 def about(self, name): print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast)) if __name__ == "__main__": cang = Girl() cang.about("wangguniang")
1.在上面這段程式中,類 Girl 繼承了類 Person。在類 Girl 中,初始化設定了 self.breast = 90 ,由於繼承了 Person,按照前面的經驗,Person 的初始化函式中的self.height = 160 也應該被 Girl 所繼承過來。然後在重寫的about 方法中,就是用 self.height 。 2.例項化類 Girl,並執行cang.about(“wangguniang”) ,試圖打印出一句話 wangguniang is a hot girl, she is ab out 160, and her bereast is 90 。 執行結果:
File "C:/Users/dell/Desktop/python/practice/test.py", line 136, in about print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast)) AttributeError: 'Girl' object has no attribute 'height'
1.報錯資訊顯示 self.height 是不存在的。也就是說類Girl 沒有從 Person 中繼承過來這個屬性。 2.原因是什麼?仔細觀察類 Girl,會發現,除了剛才強調的 about 方法重寫了, init 方法,也被重寫了。不要認為它的名字模樣奇怪,就不把它看做類中的方法(函式),它跟類 Person 中的 init 重名了,也同樣是重寫了那個初始化函式。
下面為改正之後的程式:
class Person(object): def __init__(self): self.height = 160 def about(self, name): print("{} is about {}".format(name,self.height)) class Girl(Person): def __init__(self): self.breast = 90 super(Girl, self).__init__() #使用super() def about(self, name): print("{} is a hot girl, she is about {}, and her breast is {}".format(name, self.height, self.breast)) super(Girl, self).about(name) #使用super() if __name__ == "__main__": cang = Girl() cang.about("wangguniang")
執行結果:
wangguniang is a hot girl, she is about 160, and her breast is 90
wangguniang is about 160
因為在子類中重寫了某個方法之後,父類中同樣的方法被遮蓋了。那麼如何再把父類的該 方法調出來使用呢? Python 中有這樣一種方法,這種方式是被提倡的方法:super 函式。 在子類中, init 方法重寫了,為了呼叫父類同方法,使用 super(Girl, self).init() 的方式。super 函式的引數,第一個是當前子類的類名字,第二個是 self,然後是點號,點號後面是所要呼叫的父類的方法。同樣在子類重寫的 about 方法中,也可以呼叫父類的about 方法。