理解Python中的super

2021-10-10 07:58:49 字數 4326 閱讀 8024

在單繼承時,*super().init()與base().init()*是一樣的。super()避免了基類的顯示掉用。

**如下:

super().init()

class

base()

:def

__init__

(self)

:print

("我是張三"

)class

a(base)

:def

__init__

(self)

: base.__init__(self)

print

('我是李四')a(

)# 輸出結果

# 我是張三

# 我是李四

base.init()

class

base()

:def

__init__

(self)

:print

("我是張三"

)class

a(base)

:def

__init__

(self)

:super()

.__init__(

)# super(a,self).__init__() python2

print

('我是李四')a(

)# 輸出結果

# 我是張三

# 我是李四

base

/ \

/ \

a b

\ /

\ /

c# 就是base為父類 同時被a類和b類繼承然後c類有同事繼承了a類和b類

使用super,**如下:

class

base()

:def

__init__

(self)

:print

('我是張三'

)print

("我是李四"

)class

a(base)

:def

__init__

(self)

:print

('我是陳勝'

)super()

.__init__(

)print

('我是吳廣'

)class

b(base)

:def

__init__

(self)

:print

('我是阿斌'

)super()

.__init__(

)print

('我是白潔'

)class

c(a, b)

:def

__init__

(self)

:print

("我是爸爸"

)super()

.__init__(

)print

("我是媽媽")c(

)# 輸出結果:

# 我是爸爸

# 我是陳勝

# 我是阿斌

# 我是張三

# 我是李四

# 我是白潔

# 我是吳廣

# 我是媽媽

如果不適用super,**如下:

lass base():

def__init__

(self)

:print

('我是張三'

)print

("我是李四"

)class

a(base)

:def

__init__

(self)

:print

('我是陳勝'

) base.__init__(self)

print

('我是吳廣'

)class

b(base)

:def

__init__

(self)

:print

('我是阿斌'

) base.__init__(self)

print

('我是白潔'

)class

c(a, b)

:def

__init__

(self)

:print

("我是爸爸"

) a.__init__(self)

b.__init__(self)

print

("我是媽媽")c(

)# 輸出結果 可以看出base()執行了兩次

# 我是爸爸

# 我是陳勝

# 我是張三

# 我是李四

# 我是吳廣

# 我是阿斌

# 我是張三

# 我是李四

# 我是白潔

# 我是媽媽

對於定義的類,在python中會建立乙個mro(method resolution order)列表,它代表了類繼承的順序。檢視mro列表

class

base()

:def

__init__

(self)

:print

('我是張三'

)print

("我是李四"

)class

a(base)

:def

__init__

(self)

:print

('我是陳勝'

) base.__init__(self)

print

('我是吳廣'

)class

b(base)

:def

__init__

(self)

:print

('我是阿斌'

) base.__init__(self)

print

('我是白潔'

)class

c(a, b)

:def

__init__

(self)

:print

("我是爸爸"

) a.__init__(self)

b.__init__(self)

print

("我是媽媽"

)print

(c.mro())

# 輸出結果

[<

class

'__main__.c'

>

,<

class

'__main__.a'

>

,<

class

'__main__.b'

>

,<

class

'__main__.base'

>

,<

class

'object'

>

]

使用super()

class

base()

:def

__init__

(self)

:print

('我是張三'

)print

("我是李四"

)class

a(base)

:def

__init__

(self)

:print

('我是陳勝'

)super()

.__init__(

)print

('我是吳廣'

)class

b(base)

:def

__init__

(self)

:print

('我是阿斌'

)super()

.__init__(

)print

('我是白潔'

)class

c(a, b)

:def

__init__

(self)

:print

("我是爸爸"

)super()

.__init__(

)print

("我是媽媽"

)print

(c.mro(

))

python中super 方法的理解

python中物件方法的定義很怪異,第乙個引數一般都命名為self 相當於其它語言的this 用於傳遞物件本身,有時候還會有乙個引數cls 相當於類名,當直接呼叫類方法的時候使用 python2中super 的用法 super class,self init python3中super 的用法 su...

python中super 函式的理解與基本使用

目錄 python是一門物件導向的語言,定義類時經常要用到繼承,在類的繼承中,子類繼承父類中已經封裝好的方法,不需要再次編寫,如果子類如果重新定義了父類的某一方法,那麼該方法就會覆蓋父類的同名方法,但是有時我們希望子類保持父類程式設計客棧方法的基礎上進行擴充套件,而不是直接覆蓋,就需要先呼叫父類的方...

Python的super函式直觀理解

super相關的介紹文章看了無數遍,每次看得都雲裡霧裡的,沒過多久就忘了,只模糊知道跟mro有關,但是稍微一複雜就不知道怎麼回事了,本篇文章主要記錄我對super的理解,盡量以簡單易懂的方式介紹,如果你看完這篇文章還是沒懂。那麼很抱歉,我盡力了hhhh super的作用就是執父類的方法,雖然這句話不...