python(十四)新式类和旧式类

这里有个重要概念呢在下面那个链接

   http://blog.csdn.net/zimou5581/article/details/53053775

    http://www.cnblogs.com/btchenguang/archive/2012/09/17/2689146.html

 

1、新式类都从object继承,经典类不需要。

2、新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索

3、新式类相同父类只执行一次构造函数,经典类重复执行多次。

 

(   Python 2.x中默认都是经典类,只有显式继承了object才是新式类

      Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object  )

 

一个旧式类的深度优先的例子

class A():
    def foo1(self):
        print "A"
class B(A):
    def foo2(self):
        pass
class C(A):
    def foo1(self):
        print "C"
class D(B, C):
    pass

d = D()
d.foo1()

# A

按照经典类的查找顺序从左到右深度优先的规则,在访问d.foo1()的时候,D这个类是没有的..那么往上查找,先找到B,里面没有,深度优先,访问A,找到了foo1(),所以这时候调用的是A的foo1(),从而导致C重写的foo1()被绕过

参考:https://github.com/taizilongxu/interview_python#8-%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%92%8Cformat

posted @ 2018-03-19 17:14  抽象Java  阅读(224)  评论(0编辑  收藏  举报