當前位置:首頁 » 編程語言 » python繼承類super

python繼承類super

發布時間: 2022-08-27 04:15:29

python,super(Bullet,self)是什麼意思

Bullet的父類是Sprite,
super(Bullet,self).__init__() 的意思是初始化父類是python 2.7版本。在python 3中也可以簡寫為super().__init__()
當子類有構造函數的時候,繼承父類後,如果想要調用父類的方法或者屬性就需要在子類構造函數中初始化父類
如果子類沒有新的構造函數,那麼繼承後就可以直接使用父類的方法或屬性,而不需要在子類構造函數中重新初始化父類

⑵ python 關於super的疑問

MRO(Method resolution order)是python用來解析方法調用順序的,mro中記錄了一個類的所有基類的類類型序列,super不是簡單地調用基類的方法,而是按照MRO中的順序來調用類的方法。
使用super()時,應該在所有類中使用,否則就可能發生有的類構造函數沒有調用的情況。
#!/usr/bin/python
# -*- coding: utf-8 -*-
class A(object):
def __init__(self):
print 'A __init__'
super(A, self).__init__()
print 'leave A'
class C(object):
def __init__(self):
print 'C __init__'
super(C, self).__init__()
print 'leave C'
class B(A,C):
def __init__(self):
print 'B __init__'
super(B, self).__init__()
print 'leave B'
class D(B):
def __init__(self):
print 'D __init__'
super(D, self).__init__()
print 'leave D'
if __name__ == '__main__':
D()

輸出為:
D __init__
B __init__
A __init__
C __init__
leave C
leave A
leave B
leave D

⑶ Python類繼承自object為什麼要super自己的方法

super不是指向父類, 而是指向mro中的下一個類, 所以你繼承的這個mixin子類, 他會去繼承另外一個類, 源碼裡面是ListView, 所以super返回的是ListView.

class A(object):
def __init__(self):
print(self.__class__.__mro__)

def bark(self):
print("I'm A")
super(A, self).bark()

class B(object):
def bark(self):
print("I'm B")

class C(A, B):
def bark(self):
print("I'm C")
super(C, self).bark()

if __name__ == '__main__':
c = C()
c.bark()

運行結果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'objec
t'>)
I'm C
I'm A
I'm B

因為源碼裡面是
class IndexView(BaseMixin,ListView):
所以BaseMixin裡面調用的super(BaseMixin, self).get_context_data(**kwargs), 實際上是調用的ListView的方法

⑷ Python中的super函數有什麼用,怎麼用 圖片中的super中後面的參數代表啥

super 是用來解決多重繼承問題的,直接用類名調用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復調用(鑽石繼承)等種種問題。總之前人留下的經驗就是:保持一致性。要不全部用類名調用父類,要不就全部用 super,不要一半一半。

你這裡面super(SongBird,self).__init__()就相當於
Bird.__init__(self)

⑸ 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問題


樓上的回答的很正確,簡單來說:在對類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()函數的意義,最好淺顯易懂,以及用法,謝謝

調用父類, 和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函數的問題

問題一
因為在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()用法遇到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
熱點內容
安卓微信拍了拍怎麼改 發布:2025-01-17 05:57:31 瀏覽:46
BMF伺服器的系統服務怎麼關 發布:2025-01-17 05:50:29 瀏覽:876
免刷安卓系統怎麼進入usb調試 發布:2025-01-17 05:48:21 瀏覽:837
資料庫的三層架構 發布:2025-01-17 05:17:36 瀏覽:149
雲頂之弈有人開腳本怎麼舉報 發布:2025-01-17 05:16:59 瀏覽:682
sql包含數字 發布:2025-01-17 05:11:56 瀏覽:292
密碼忘記了怎麼查看 發布:2025-01-17 05:02:30 瀏覽:682
腳本執行sql語句 發布:2025-01-17 04:47:51 瀏覽:702
結構體訪問成員變數 發布:2025-01-17 04:32:09 瀏覽:31
熱點緩存 發布:2025-01-17 04:30:07 瀏覽:523