在單繼承時,*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的作用就是執父類的方法,雖然這句話不...