pythonsuper用法
『壹』 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的使用
Yes, and since py3.5, `super(Man, self).__init__(name, has_wife)` can be replaced as below:
super().__init__(name,has_wife)
『叄』 python super函數
classA:
defprint1(self):
print('A')
classB:
defprint2(self):
super().print1()
b=B()
b.print2()
注意 self。默來認的調自用方式是調用綁定方法的。
『肆』 python語句(具體如下)super的用法不理解,求大神指教!本人初學者,剛剛開始學習中。。。
super().xxx的作用是調用父類的xxx方法,在重寫xxx方法時,這個方法的內容已經和原方法完全無關了,因此如果希望在重寫之後仍然能執行原方法的邏輯,就需要使用super().xxx來調用父類的原方法。
『伍』 關於python中super類
super 是用來解決多重繼來承問題自的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鑽石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名調用父類,要不就全部用 super,不要一半一半。
『陸』 python super方法怎麼訪問多個超類
super(超類)其實有兩個作用
繼承父類
父類類名修改之後,不需要在所有子類中進行類名修改
- >>> class A(object):... def __init__(self):... self.hungry = True... def eat(self):... if self.hungry:... print('i'm hungry!!!')... else:... print('i'm not hungry.')... 123456789
- >>> class B(A): #括弧中的A就是父類A,被B繼承... def __init__(self): #此魔術方法覆蓋了父類的構造方法__init__,即此類中的所有self只指自己(子類)... self.sound = 'love me.mp3'... def sing(self):... print(self.sound)
- >>> s = B()
- >>> s.sing()
- love me.mp3
- >>> s.eat() #B類沒有繼承到A類的所有方法及屬性Traceback (most recent call last):
- File "<input>", line 1, in <mole>
- File "<input>", line 5, in eat12345678910111213
- >>> class C(A):... def __init__(self):... super(C,self).__init__() #這種代碼就有一個問題,如果A類的這個A名稱被修改,所有有A的地方都需要修改
- #等價代碼是A.__init__(self)... self.sound = 'love me.mp3' ... def sing(self):... print(self.sound)... >>> ss = C()
- >>> ss
- <C object at 0x0000000004907E10>
- >>> ss.sing()
- love me.mp3
- >>> ss.eat() #此時就繼承到了A類中的所有屬性及方法i'm hungry!!!
創建父類
繼承父類
『柒』 請教在python2.7中如何使用super關鍵字
classFoo(object):
def__init__(self,frob,frotz):
self.frobnicate=frob
self.frotz=frotz
classBar(Foo):
def__init__(self,frob,frizzle):
super(Bar,self).__init__(frob,34)
self.frazzle=frizzle
new=Bar("hello","world")
printnew.frobnicate
printnew.frazzle
printnew.frotz
『捌』 python的類和對象中的super函數的問題
問題一
因為在B類中調用了super方法,所以沒有執行完B類就去執行C類的程序
super方法在多重繼承程序中的調用順序,採用的是C3演算法(在python3中)。
C3演算法的規則如下
①.從底層開始,選擇入邊為零的點。
②.從左到右。
③深度探索。但受限於②規則。
每一個類都可以用mro函數查看自己的繼承順序(MRO全稱Method Resolution Order,就是用來定義繼承方法的調用順序)
對於你的程序
分析
①規則。得到D類,去掉D類以後,入邊為零的是B類和C類
②規則。選擇B類,去掉B類後,入邊為零的只有C類。結論是D–>B–>C–>A。
在d=D()語句前加print(D.mro()),就可以列印出D類的繼承順序
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
問題二
python3的繼承不同於普通的繼承,super函數已經考慮到了重復繼承的問題,所以對於A類只訪問一次
『玖』 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()
『拾』 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