super的例項及實現原理

2022-08-11 03:09:11 字數 2505 閱讀 9532

class a():

def go(self):

print ("go a go!")

def stop(self):

print ("stop a stop!")

def pause(self):

raise exception("not implemented")

class b(a):

def go(self):

super(b, self).go()

print ("go b go!")

class c(a):

def go(self):

super(c, self).go()

print ("go c go!")

def stop(self):

super(c, self).stop()

print ("stop c stop!")

class d(b,c):

def go(self):

super(d, self).go()

print ("go d go!")

def stop(self):

super(d, self).stop()

print ("stop d stop!")

def pause(self):

print ("wait d wait!")

class e(b,c):

pass

a = a()

b = b()

c = c()

d = d()

e = e()

# 說明下列**的輸出結果

a.go()

print('--------')

b.go()

print('--------')

c.go()

print('--------')

d.go()

print('--------')

e.go()

print('--------')

a.stop()

print('--------')

b.stop()

print('--------')

c.stop()

print('--------')

d.stop()

print('--------')

e.stop()

print(d.mro())

a.pause()

b.pause()

c.pause()

d.pause()

e.pause()

a.go()# go a go!

b.go()# go a go!# go b go!

c.go()# go a go!# go c go!

d.go()# go a go!# go c go!# go b go!# go d go!

e.go()# go a go!# go c go!# go b go!

a.stop()# stop a stop!

b.stop()# stop a stop!

c.stop()# stop a stop!# stop c stop!

d.stop()# stop a stop!# stop c stop!# stop d stop!

e.stop()# stop a stop!

a.pause()# ... exception: not implemented

b.pause()# ... exception: not implemented

c.pause()# ... exception: not implemented

d.pause()# wait d wait!

e.pause()# ...exception: not implemented

super的工作原理如下:

def super(cls, inst):

mro = inst.__class__.mro()

return mro[mro.index(cls) + 1]

cls代表類,inst代表例項,可以看出上面的**做了兩件事:

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

現在再回答前面的例子:

super(c, self).__init__()

這裡的self是c的例項,self.class.mro()的結果是;

[, , , , ]

super(a, self).__init__()

注意這裡的self也是當前c的例項,mro列表和之前是一樣的。搜尋a在mro中下的乙個類,發現是b,於是又跳到了b的init,這時會列印enter b,而不是enter base。

上面整個過程還是比較清晰的,關鍵在於理解super的工作方式,而不是想當然的理解為super呼叫父類的方法。

總結:

IOS self和super詳解實現原理及區別

self和super區別 1 self呼叫自己方法,super呼叫父類方法 2 self是類,super是預編譯指令 3 self class 和 super class 輸出是一樣的 self和super底層實現原理 1 當使用 self 呼叫方法時,會從當前類的方法列表中開始找,如果沒有,就從父...

MOV實現原理及簡單管理例項

思想 建立骨骼,執行動畫,獲取骨骼的資料,在update中設定實時設定攝像機的look,eye點即可實現此效果,為了實現管理可以建立乙個單例類管理,例如 g.c camerasan setmetatable c camerasan,function c camerasan new local cam...

super和this與例項及靜態變數的關係

super和this的使用實質必須建立在物件例項已經生成的基礎上,而靜態變數不需要類例項就能使用。例如 1.public class t1 extends t 此例將會報錯,首先this指代不明 t沒有用this 一般情況下this不用在public static void mian string ...