note: super() only works for new-style classes.
super() 函式的乙個常見用法是在 __init__() 方法中確保父類被正確的初始化了
作用super() 函式是子類用於呼叫父類(超類)的乙個方法。
super 是用來解決多重繼承問題的,直接用類名呼叫父類(base.__init__(self))方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序(mro)、重複呼叫(鑽石繼承)等種種問題。
mro 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。
使用場景假如說在父類中實現了乙個方法,你想在子類中使用父類的這個方法並且做一定擴充套件但是又不想完全重寫,並且這個場景中的繼承屬於多繼承,那麼super()就出場了,可以實現方法的增量修改。
呼叫方式python2:
super(currentclass, self).method(arg)
python3:
super().method(arg)
使用舉例class
basicclasspeople
(object):
def__init__
(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
defshort_introduction
(self):
print
'my name is {}, a {}, this year i am {} years old'.format(self.name,self.gender,self.age)
class
extenclassone
(basicclasspeople):
def__init__
(self,name,age,gender,job):
super(extenclassone, self).__init__(name,gender,age)
self.job = job
defshort_introduction
(self):
print
'my name is {}, a {}, this year i am {} years old, my job is {}'.format(self.name, self.gender, self.age,self.job)
在上邊的程式中extenclassone繼承自basicclasspeople,但是它想在初始化的時候為類新增加乙個屬性,如果不使用super的話我們就只能重寫初始化函式了,但是使用了super之後我們只需要在定義擴充套件的初始化函式時呼叫父類初始化函式,然後把自己新增的屬性新增到呼叫語句後面就可以了。
super()可以避免重複呼叫
class
base:
def__init__
(self):
print('base.__init__')
class
a(base):
def__init__
(self):
base.__init__(self)
print('a.__init__')
class
b(base):
def__init__
(self):
base.__init__(self)
print('b.__init__')
class
c(a,b):
def__init__
(self):
a.__init__(self)
b.__init__(self)
print('c.__init__')
執行這段**就會發現 base.__init__() 被呼叫兩次,如下所示:
>>> c = c()
base.__init__
a.__init__
base.__init__
b.__init__
c.__init__
>>>
使用super()之後
class
base:
def__init__
(self):
print('base.__init__')
class
a(base):
def__init__
(self):
super().__init__()
print('a.__init__')
class
b(base):
def__init__
(self):
super().__init__()
print('b.__init__')
class
c(a,b):
def__init__
(self):
super().__init__() # only one call to super() here
print('c.__init__')
執行結果:
發現每個__init__() 方法只會被呼叫一次了:
>>> c = c()
base.__init__
b.__init__
a.__init__
c.__init__
>>>
Python中super的用法
super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類,要不就全部用 super,不要一半一半。普通繼承 python view p...
Python中super的用法
分類 python 2014 05 21 17 50 6637人閱讀收藏 舉報super 是用來解決多重繼承問題的,直接用類名呼叫父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查詢順序 mro 重複呼叫 鑽石繼承 等種種問題。總之前人留下的經驗就是 保持一致性。要不全部用類名呼叫父類...
python中super用法研究
python語言與c 有相似的類繼承,在類定義時,python中會自定義第乙個self,類似c 中this指標,指向物件自身。python簡單的類舉例 class hello object def print c print hello world hello print c hello world...