1. 程式人生 > >MRO C3演算法 super的運用

MRO C3演算法 super的運用

-------------態度決定成敗,無論情況好壞,都要抱著積極的態度,莫讓沮喪取代熱心。生命可以價值極高,也可以一無是處,隨你怎麼去選擇。
# ------------------------------------------------------------------------------------------------------------#

# super()# MRO + super ⾯面試題

# super是查詢mro順序中的下一個
# 單繼承中我們可以認為super是對父類中的屬性或方法的引入

class ShengWu:
def dong(self): # 例項方法
print(self)
print("我是生物")


class Animal(ShengWu):
pass


class Cat(Animal):
def dong(self): # 子類中出現了和父類重名的內容. 表示對父類的方法的覆蓋(重寫). 半蓋(java)
super(Animal, self).dong() # 定位到Animal. 找Animal的下一個
# super(類, 物件).方法() 找到MRO中的類. 找這個類的下一個. 去執行方法
print("我的貓也會動")


# 找MRO中的下一個
# Cat -> Animal -> ShengWu

c = Cat()
print(c)
c.dong()


# MRO + super ⾯試題
class Init(object):
def __init__(self, v):
print("init")
self.val = v # 2


class Add2(Init):
def __init__(self, val): # 2
print("Add2")
super(Add2, self).__init__(val)
print(self.val) # 5.0
self.val += 2 # 7.0


class Mult(Init):
def __init__(self, val):
print("Mult")
super(Mult, self).__init__(val)
self.val *= 5 # 5.0


class HaHa(Init):
def __init__(self, val):
print("哈哈")
super(HaHa, self).__init__(val)
self.val /= 5 # 1.0


class Pro(Add2, Mult, HaHa): #
pass


class Incr(Pro):
def __init__(self, val): # 5
super(Incr, self).__init__(val)
self.val += 1 # 8.0

'''
add2
Mult
哈哈
init
5.0
8.0
Add2
init
2
4

'''


# Incr, pro, add2, mult, haha, Init
p = Incr(5)
print(p.val) # ?
# Add2 init
c = Add2(2)
print(c.val) # ?


# ------------------------------------------------------------------------------------------------------------#
# 新式類的MRO(重點, 難點) C3演算法
# 先拆分
# 再合併 第一項的頭和後面所有項的尾進行比較如果出現了. 就拿出來 如果沒出現. 下一項....


class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
class E(C, A):
pass
class F(D, E):
pass
class M(F, E):
pass
class N:
pass
class P(M,N):
pass
class G(P):
pass
class O:
pass
class X(O):
pass
class H(G, X, F):
pass
print(H.__mro__)
'''
L(H) = H + L(G) + L(X) + L(F) + GXF HGPMXFDBECANO

L(G) = G + L(P) + P # GPMFDBECAN
L(X) = X + L(O) + O # XO
L(F) = F + L(D) + L(E) + DE # FDBECA


L(P) = P + L(M) + L(N) + MN # PMFDBECAN
L(D) = D + L(B) + L(C) + BC # DBCA
L(E) = E + L(C) + L(A) + CA # ECA

L(M) = M + L(F) + L(E) + FE # ECA ECA E MFDBECA

'''


'''
L(H) = H + L(G) + X+ L(F) HGPMFDBECAN FDBECA

L(G) = G + L(P) GPMFDBECAN
L(F) = F + L(D) + L(E) FDBECA

L(P) = P + L(M) + L(N) PMFDBECAN
L(D) = D + L(B) + L(C) DBCA
L(E) = E + L(C) + L(A) ECA

L(M) = M + L(F) + L(E) MFDBECA
L(N) = N
L(B) = B + L(A) BA
L(C) = C + L(A) CA

L(A) = A
'''


'''
設L為查詢方法的MRO順序
L(H) = H + L(G) + L(F)
L(G) = G + L(E)
L(F) = F + L(D) + L(E)
L(D) = D + L(B) + L(C)
L(B) = B + L(A)
L(E) = E + L(C) + L(A)
L(C) = C + L(A)
L(A) = A


合併. 從下向上合併. 拿出每一項的頭和後一項的身體進行比較. 如果出現了. 就過, 從後一項的頭繼續去比較. 如果不出現就出來

HGFDBECA

L(H) = H + L(G) + L(F) ECA + FDBECA
L(G) = G + L(E) GECA
L(F) = F + L(D) + L(E) FDBECA
L(D) = D + L(B) + L(C) DBCA
L(B) = B + L(A) BA
L(E) = E + L(C) + L(A) ECA
L(C) = C + A CA
L(A) = A

新式類通過__mro__可以直接看到MRO的結果
'''
# HGF DBE CA object
# print(H.__mro__)

# 給面試官用的.