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
从左到右,深度递归,一直到头再返回
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
上一篇: php中用unset销毁变量并释放内存
下一篇: Scrapy 基础-01