superpython
『壹』 python,super(Bullet,self)是什麼意思
Bullet的父類是Sprite,
super(Bullet,self).__init__() 的意思是初始化父類是python 2.7版本。在python 3中也可以簡寫為super().__init__()
當子類有構造函數的時候,繼承父類後,如果想要調用父類的方法或者屬性就需要在子類構造函數中初始化父類
如果子類沒有新的構造函數,那麼繼承後就可以直接使用父類的方法或屬性,而不需要在子類構造函數中重新初始化父類
『貳』 python中super關鍵字的使用
案例一:單繼承時super關鍵字的使用:
log:
解釋:這里的慧穗扮super強制調用了父類的方法,不僅僅是__init__方法,也可以是強前灶制調用父類普通方法(如cry)
案例二:多繼承時super的使用
先不看cry方法,只看__init__方法,原理都是一樣的,這里的哈士奇和金毛都繼承了Dog類,而雜交犬繼承了金毛和哈士奇
看一下log:
雖然只創建了一個dog3對象,但是分別調用了Dog,Husky,Golden的__init__方法。
案列三:不使用super關鍵字,寫一下多繼承:
用父類直接族老調用自己的__init__方法
看一下log:
可以發現這里多列印了一句「普通狗狗的眼睛是黑色」,也就是說多調用了一次Dog()的__init__()方法
總結:所以super可以用來強制調用父類方法(包括__init__方法,和其他自定義方法),但是super可以避免多繼承時重復調用父類方法。
『叄』 python super()用法遇到TypeError: must be type, not classobj
第一關於
super().__init__()
這種不指定子類的繼承方法是在Python 3中新加入的,因為你使用的是Python 2, 所以會報錯。
第二,關於TypeError,請題主在定義兩個父類的時候加入他們的父類(object),如下,再嘗試一次,因為Python 2中的classobj不算做一種type,如果你用Python 3的話應該就沒有這種問題了。
classBase1(object):
def__init__(self):
print"我是Base1"
classBase2(object):
def__init__(self):
print"我是Base2"
另外一點題外話,題主對Base這個子類採用了雙重繼承,即此子類同時擁有兩個父類(Base1和Base2),這種繼承方法有時容易造成混亂,即如果兩個父類有相同的方法名或變數名時,無法確定應繼承哪一個。因此在諸如Java等語言中多重繼承是不允許的。Python允許多重繼承,但在這種情況下為了避免混亂,Python會自動按順序選擇擁有所需方法名的第一個父類並執行,而忽略其他父類中的同名方法。比如你的
classBase(Base1,Base2):
def__init__(self):
super(Base,self).__init__()
中,使用
super(Base,self).__init__()
來呼叫Base父類的__init__方法,由於Base的父類有兩個(Base1和Base2),並且兩個都有__init__方法,所以Python默認只按順序呼叫Base1的__init__方法而忽略Base2的。這樣你運行
bbbb=Base()
時就只會顯示
我是Base1
而不會顯示「我是Base2」。如果你要使用super()方法並希望像使用
classBase(Base1,Base2):
def__init__(self):
Base1.__init__(self)
Base2.__init__(self)
時一樣同時輸出「我是Base1」和「我是Base2」的話,你需要修改代碼使Base2為Base1的子類,Base為Base2的子類才可以。如下:
classBase1(object):
def__init__(self):
print"我是Base1"
classBase2(Base1):
def__init__(self):
super(Base2,self).__init__()
print"我是Base2"
classBase(Base2):
def__init__(self):
super(Base,self).__init__()
這樣你運行
bbbb=Base()
時才會輸出
我是Base1
我是Base2
『肆』 Python請問以下代碼類名中的(list)和方法中的super是什麼意思
super是父類,也就是list
『伍』 python中的super()是什麼意思呢
super就是在子類中調用父類方法時用的。
classFooParent(object):
def__init__(self):
self.parent='I'mtheparent.'
print'Parent'
defbar(self,message):
printmessage,'fromParent'
classFooChild(FooParent):
def__init__(self):
super(FooChild,self).__init__()#調用父類初始化方法
print'Child'
defbar(self,message):
super(FooChild,self).bar(message)#調用父類bar方法
print'Childbarfuction'
printself.parent
if__name__=='__main__':
fooChild=FooChild()
fooChild.bar('HelloWorld')
如果解決了您的問題請採納!
如果未解決請繼續追問
『陸』 python多重繼承下super問題
樓上的回答的很正確,簡單來說:在對類D進行實例化的時候,你依次對類C和類A進行了初始化,結果就會以後初始化的B為准了
實際上在子類里並不需要去初始化父類,你在實例化子類的同時,繼承自父類的對象都會被創建
classA(object):
def__init__(self):
self.a=1
classB(A):
def__init__(self):
self.a=2
self.b=2
classC(B,A):
pass
>>> c = C()
>>> c.a
>>> 2
另外補充一下。父類為新式類的情況下,繼承順序是有影響的。繼承順序上,經典類是深度優先,新式類是廣度優先,兩種混用的話,分分鍾就暈乎了。可以去多做做實驗,好好了解。
『柒』 使用python的super時出現的TypeError: must be type, not classobj 原因及解決
示例如下:
但是運行報錯:TypeError: must be type, not classobj
查找資料之後發現,python中super只能應用於襪拿睜新類,而不能應用於經典類
所謂新類 : 就是所有類都必須要有繼承的類,如果什麼都不想繼承,就繼承到告歲object類。下面是一個新類的例子
所謂經典類 : 就是什麼都不用繼承的類,例如:
產上上面的問題,而自己又不知道父類該繼承什麼,最簡單的方法就是讓它去繼承object類敏談,例如:
『捌』 python中super為什麼能解決多重繼承問題
1. super 並不是一個函數,是一個類名,形如 super(B, self) 事實上調用了 super 類的初始化函數,產生了一個 super 對象;
2. super 類的初始化函數並沒有做什麼特殊的操作,只是簡單記錄了類類型和具體實例;
3. super(B, self).func 的調用並不是用於調用當前類的父類的 func 函數;
4. Python 的多繼承類是通過 mro 的方式來保證各個父類的函數被逐一調用,而且保證每個父類函數只調用一次(如果每個類都使用 super);
5. 混用 super 類和非綁定的函數是一個危險行為,這可能導致應該調用的父類函數沒有調用或者一個父類函數被調用多次。
6. 用 super,遇到修改父類的名字時等情況
『玖』 python中super()函數的意義,最好淺顯易懂,以及用法,謝謝
調用父類, 和parent一個意思. 只不過python使用的繼承方式有點特別, 所以用起來有點特別
php"><?php
classA
{
functionhello()
{
print"A ";
}
}
classSonOfA
{
functionhello()
{
parent::hello();
}
}
那麼在python里就是通過 super(A, self) 獲得指向父類的指針(當成指針好了), 然後調用hello.
super(A,self).hello()#相當於呼叫A的hello
#據說python3,可以
super().hello()