Loading

python MOR 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 G(E):
     pass
class H(G, F):
     pass

首先。我们要确定从H开始找。也就是说。创建的是H的对象。
如果从H找。那找到H的父类的C3,我们设C3算法是L(X),即给出X类,找到XMRO

  L(H) = H + L(G) + L(F)
  继续从代码中找G和F的⽗类往⾥⾯带
  L(G) = G + L(E)
  L(F) = F + L(D)+ L(E)
  继续找E 和 D
  L(E) = E + L(C) + L(A)
  L(D) = D + L(B) + L(C)
  继续找B和C
  L(B) = B + L(A)
  L(C) = C + L(A)

最后就剩下⼀个A了. 也就不⽤再找了. 接下来. 把L(A)往⾥带. 再推回去. 但要记住. 这⾥的
表⽰的是merge. merge的原则是⽤每个元组的头⼀项和后⾯元组的除头⼀项外的其他元素进⾏比较,
看是否存在. 如果存在. 就从下⼀个元组的头⼀项继续找. 如果找不到. 就拿出来.
作为merge的结果的⼀项. 以此类推. 直到元组之间的元素都相同. 也就不⽤再找了.

L(B) =(B,) + (A,) -> (B, A)
L(C) =(C,) + (A,) -> (C, A)
继续带.
  L(E) = (E,) + (C, A) + (A) -> E, C, A
  L(D) = (D,) + (B, A) + (C, A) -> D, B, A
继续带.
  L(G) = (G,) + (E, C, A) -> G, E, C, A
  L(F) = (F,) + (D, B, A) + (E, C, A) -> F, D, B, E, C, A
加油,最后了
  L(H) = (H, ) + (G, E, C, A) + ( F, D, B, E, C, A) -> H, G, F, D, B, E, C, A
算完了. 最终结果 HGFDBECA. 那这个算完了. 如何验证呢? 其实python早就给你准备好
了. 我们可以使⽤类名.__mro__获取到类的MRO信息.

rint(H.__mro__)
结果:
(<class '__main__.H'>, <class '__main__.G'>, <class '__main__.F'>, <class
'__main__.D'>, <class '__main__.B'>, <class '__main__.E'>, <class
'__main__.C'>,<class '__main__.A'>, <class 'object'>)

例子

class Foo:
     def func1(self):
         super().func1() # 此时找的是MRO顺序中下⼀个类的func1()⽅法
         print("Foo")
 
class Bar:
     def func1(self):
         print("bar")
 
class Ku(Foo, Bar):
     def func1(self):
         super().func1() # 此时super找的是Foo
         print("ku")
 
k = Ku() # 先看MRO . KU, FOO, BAR object
k.func1()
print(Ku.__mro__)
 
k2 = Foo() # 此时的MRO. Foo object
k2.func1() # 报错
class Init(object):
     def __init__(self, v):
         print("init")
         self.val = v
 
class Add2(Init):
     def __init__(self, val):
         print("Add2")
         super(Add2, self).__init__(val)
         print(self.val)
         self.val += 2
class Mult(Init):
     def __init__(self, val):
         print("Mult")
         super(Mult, self).__init__(val)
         self.val *= 5
class HaHa(Init):
     def __init__(self, val):
         print("哈哈")
         super(HaHa, self).__init__(val)
         self.val /= 5
class Pro(Add2,Mult,HaHa): #
     pass
class Incr(Pro):
     def __init__(self, val):
         super(Incr, self).__init__(val)
        self.val+= 1
# Incr Pro Add2 Mult HaHa Init
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)
class Init(object):
	def __init__(self, v):
		print("init")
		self.val = v
 
class Add2(Init):
	def __init__(self, val):
		print("Add2")
		super(Add2, self).__init__(val)
		print(self.val)
		self.val += 2

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

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

class Pro(Add2,Mult,HaHa):
	pass

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


# Incr = Incr + L(Pro)

# L(Pro) = L(Add2) + L(Mult)  + L(HaHa)

# L(Add2) = Add2 + L(Init)
# L(Mult) = Mult + L(Init)

# L(HaHa) = HaHa + L(Init)

# Incr + Pro + Add2 + Mult + HaHa + Init


print(Incr.__mro__)
# Incr Pro Add2 Mult HaHa Init
p = Incr(5)
print(p.val)
c = Add2(2)
print(c.val)
posted @ 2021-09-30 11:21  Test002  阅读(8)  评论(0)    收藏  举报