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 ...