class A: def __init__(self): print("world") class B(A): def __init__(self): print("hello") B() # output: hello
在全部其餘與super構造函數一塊兒使用的語言中,都是隱式調用的。 如何在Python中調用它? 我指望super(self)
但這不起做用。 函數
super()
在新樣式類中返回相似父對象的對象: 編碼
class A(object): def __init__(self): print("world") class B(A): def __init__(self): print("hello") super(B, self).__init__() B()
使用Python 2.x舊式類將是這樣: spa
class A: def __init__(self): print "world" class B(A): def __init__(self): print "hello" A.__init__(self)
一種方法是調用A的構造函數並將self
做爲參數傳遞,以下所示: code
class B(A): def __init__(self): A.__init__(self) print "hello"
這種樣式的優勢是很是清晰。 它稱爲A的初始化程序。 缺點是,它不能很好地處理菱形繼承,由於您可能最終會兩次調用共享基類的初始化程序。 對象
另外一種方法是使用super(),如其餘人所示。 對於單繼承,它基本上與讓您調用父級的初始化程序相同。 繼承
可是,super()的內幕要複雜得多,有時在多重繼承狀況下可能會違反直覺。 從正面來看,super()可用於處理菱形繼承。 若是您想知道super()的做用的本質, 這裏是我對super()的工做原理的最佳解釋(儘管我不必定贊同該文章的觀點)。 get
與其餘答案一致,有多種方法能夠調用超類方法(包括構造函數),可是在Python-3.x中,該過程已獲得簡化: it
Python-2.x io
class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(B, self).__init__()
Python-3.x class
class A(object): def __init__(self): print("world") class B(A): def __init__(self): print("hello") super().__init__()
按照docs super(<containing classname>, self)
super()
如今等效於super(<containing classname>, self)
。
我使用如下公式擴展了先前的答案:
class A(object): def __init__(self): print "world" class B(A): def __init__(self): print "hello" super(self.__class__, self).__init__() B()
這樣,您沒必要在對super的調用中重複類的名稱。 若是您要編碼大量的類,而且但願使初始化程序方法中的代碼與類名無關,那麼它會很方便。