如何在Python中調用超級構造函數?

class A:
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
       print("hello")

B()  # output: hello

在全部其餘與super構造函數一塊兒使用的語言中,都是隱式調用的。 如何在Python中調用它? 我指望super(self)但這不起做用。 函數


#1樓

super() 在新樣式類中返回相似父對象的對象: 編碼

class A(object):
    def __init__(self):
        print("world")

class B(A):
    def __init__(self):
        print("hello")
        super(B, self).__init__()

B()

#2樓

使用Python 2.x舊式類將是這樣: spa

class A: 
 def __init__(self): 
   print "world" 

class B(A): 
 def __init__(self): 
   print "hello" 
   A.__init__(self)

#3樓

一種方法是調用A的構造函數並將self做爲參數傳遞,以下所示: code

class B(A):
    def __init__(self):
        A.__init__(self)
        print "hello"

這種樣式的優勢是很是清晰。 它稱爲A的初始化程序。 缺點是,它不能很好地處理菱形繼承,由於您可能最終會兩次調用共享基類的初始化程序。 對象

另外一種方法是使用super(),如其餘人所示。 對於單繼承,它基本上與讓您調用父級的初始化程序相同。 繼承

可是,super()的內幕要複雜得多,有時在多重繼承狀況下可能會違反直覺。 從正面來看,super()可用於處理菱形繼承。 若是您想知道super()的做用的本質, 這裏是我對super()的工做原理的最佳解釋(儘管我不必定贊同該文章的觀點)。 get


#4樓

與其餘答案一致,有多種方法能夠調用超類方法(包括構造函數),可是在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)


#5樓

我使用如下公式擴展了先前的答案:

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(self.__class__, self).__init__()

B()

這樣,您沒必要在對super的調用中重複類的名稱。 若是您要編碼大量的類,而且但願使初始化程序方法中的代碼與類名無關,那麼它會很方便。

相關文章
相關標籤/搜索