2014-02-27 23 views
1

傳遞給超(參數)參數.__的init __(,覆蓋的構造,並在同一時間實現它,你可以使用這樣的事情的Python:誰擁有根據蟒蛇繼承)

class Dog : 
    def __init__(self, name) : 
     self.name = name 
     print("This is a dog named {}".format(self.name)) 

class Bingo(Dog) : 
    def __init__(self, name) : 
     super().__init__(self.name) 

但我注意到一些代碼,我遇到了,超級自身攜帶的說法一樣,

super(self, name).__init__() 

,所以如果我可能會問,哪裏是傳遞給說法,是它的父類還是什麼。我覺得很難總結我的頭在這,我居然在PyQt的和PySide

+1

'super()'很可能來自'Python 3.x'代碼,其中參數是可選的。在'Python 2.x'中,你必須編寫'super()'來獲得相同的效果。但是,在這兩種情況下,都將參數傳遞給構造函數本身(即'__init __()')。 – isedev

+0

[爲什麼是Python 3.x的super()魔法?](http://stackoverflow.com/questions/19608134/why-is-python-3-xs-super-magic) –

+1

'self'和' name'是super()對象的參數,實際上是傳入的錯誤參數。第一個參數必須是類型(所以類),第二個參數必須是第一個參數的實例。 –

回答

0

在Python 2.x中遇到它的代碼,你將不得不寫

class Bingo(Dog) : 
    def __init__(self, name) : 
     super(Dog, self).__init__(name) 

因爲super所需的超類別名稱( Dog)和實例(self)。超級的__init__Dog.__init__因此通常會從Bingo.__init__參數(如名稱),而不是你所擁有的(self.name,不正確,因爲還不存在)。

在Python 3.0,因爲super()被賦予更多的行爲,允許它弄清楚你Dogself你可以寫

class Bingo(Dog) : 
    def __init__(self, name) : 
     super().__init__(name)