欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python面向对象(C3算法)(六)

程序员文章站 2022-11-21 17:32:24
1. 了解python2和python3类的区别 python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类 2. 经典类的MRO 树形结构的深度优先遍历 -> 树形结构遍历 从左到右,深度递归,一直到头再返回 Foo -> H -> G -> D -> B -> A -> C -> ......

1. 了解python2和python3类的区别

    python2在2.3之前使用的是经典类, 2.3之后, 使用的是新式类

2. 经典类的mro 树形结构的深度优先遍历 -> 树形结构遍历

class a:
    pass
class b(a):
    pass
class c(a):
    pass
class d(b, c):
    pass
class e:
    pass
class f(d, e):
    pass
class g(f, d):
    pass
class h:
    pass
class foo(h, g):
    pass

python面向对象(C3算法)(六)

  从左到右,深度递归,一直到头再返回

  foo -> h -> g -> d -> b -> a -> c -> e

3. 新式类的mro c3算法

 拿第一项的第一位和 后面每项的除了第一位比较. 如果没有出现, 则该位元素算出如果出现了. 此时开始下一项的第一位继续和后面每一项的除了第一位比较:

 

    用头和身体比较

 方法:   1. 拆分

 

       2. 合并

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
l(h) = h + l(g) + l(f) + gf # eca + dbeca  = hgfdbecao
l(g) = g + l(e) + e # geca
l(e) = e + l(c) + l(a) + ca # eca
l(c) = c + l(a) + a # ca
l(a) = a
l(f) = f + l(d) + l(e) + de # fdbeca
l(d) = d + l(b) + l(c) + bc # dbca
l(b) = b + a + a # ba
与python中使用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'>)
4. super() 找mro顺序的下一个

 

class base1:
    def chi(self):
        super().chi() 
        print("base1")

class base2:
    def chi(self):
        super().chi()
        print("base2")

class base3:
    def chi(self):
        print("base3")

class bar(base1, base2, base3):
    def chi(self):
        print("bar里chi1")
        super(bar, self).chi() 
        print("bar里chi2")

b = bar()

  结果 :bar里chi1,base3,base2,base1,bar里chi2