python中super 方法的理解

2022-09-01 10:36:09 字數 2523 閱讀 8373

python中物件方法的定義很怪異,第乙個引數一般都命名為self(相當於其它語言的this),用於傳遞物件本身,

有時候還會有乙個引數cls(相當於類名,當直接呼叫類方法的時候使用)。

python2中super()的用法:

super(class,self).__init__()

python3中super()的用法:

super().__init__()

在類的繼承裡面super()非常常用, 它解決了子類呼叫父類方法的一些問題, 父類多次被呼叫時只執行一次。

def super(cls, inst):

mro = inst.__class__.mro()

return mro[mro.index(cls) +

1]當使用 super(cls, inst) 時,python 會在 inst 的類的 mro 列表上搜尋 cls 的下乙個類。

而檢視inst類的的mro列表的方法就是:

類.mro()   或  類.__mro__ 或 inst.__class__.mro()

例如:當c是乙個類的時候,獲得乙個類的mro的方法是

c.mro() 或  c.__mro__  或 c().__class__.mro()

執行過程:

當執行生成d的inst物件的時候,先執行enter d

這個時候d類的mro列表為[, , , , ]

當執行super(d,self) 就是在self物件的類的mro列表中查詢d的下乙個父類。這個self是d類的例項物件inst。

而d類中的mro列表中d的下乙個父類是b。

例如:1、super單繼承的時候:

class a:

def __init__(self):

self.n = 2

def add(self, m):

print('self is @a.add'.format(self))

self.n += m

class b(a):

def __init__(self):

self.n = 3

def add(self, m):

print('self is @b.add'.format(self))

super().add(m)

self.n += 3

b = b()

b.add(2)

print(b.n)

結果是什麼呢?

為什麼是8?

執行b.add(2)的時候,執行a中的add()函式,執行的時候這個時候的self是b這個例項,所以這個self.n是3

所以執行3+2=5

然後執行super的下一句5+3=8。

2、super多繼承的時候

#super的多繼承

class a:

def __init__(self):

self.n = 2

def add(self, m):

print('self is @a.add'.format(self))

self.n += m

class b(a):

def __init__(self):

self.n = 3

def add(self, m):

print('self is @b.add'.format(self))

super().add(m)

self.n += 3

class c(a):

def __init__(self):

self.n = 4

def add(self, m):

print('self is @c.add'.format(self))

super().add(m)

self.n += 4

class d(b, c):

def __init__(self):

self.n = 5

def add(self, m):

print('self is @d.add'.format(self))

super().add(m)

self.n += 5

d = d()

d.add(2)

print(d.n)

這個結果是什麼呢?

我認為是5+b.add+c.add+a.add+5=5+3+4+2+5=19

看下輸出的結果:

執行過程是什麼樣的呢?

詳細的**分析如下:

Python中super 方法的使用

如果在子類中也定義了構造器,既 init 函式,那麼基類的構造器該如何呼叫呢?方法 一 明確指定 使用乙個子類的例項去呼叫基類的構造器,在子類的構造器中明確的指明呼叫基類的構造器。class c p def init self p.init self print calling cs constru...

Python中super 方法的使用

先看一段 class stmatrix object 定義乙個類 docstring for stmatrix def init self,data,timestamps,t 24,checkcomplete true 建構函式 super stmatrix,self init super表繼承,這...

python中super方法的注意點

之前,碰到乙個很有意思的問題,呼叫super之後,並沒有按照預期執行。大概是如下的 usr bin env python coding utf 8 class a object def init self print type self mro deftest self print a.test p...