python中的类继承问题

先从现象来看:

class Base1(object):  
    def foo(self): print "Base1"  

class Base2(Base1):          
    pass

class Base3(object):  
    def foo(self): print "Base3"

class Base4(Base1):  
    def foo(self): print "Base4"

class Derived1(Base2,Base3):  
    pass

class Derived2(Base2,Base4):  
    pass

instance = Derived1()  
instance.foo()  
print Derived1.__mro__  

instance = Derived2()  
instance.foo()  
print Derived2.__mro__  

print '-------------'

class oldBase1():  
    def foo(self): print "Base1"  

class oldBase2(oldBase1):          
    pass

class oldBase3():  
    def foo(self): print "Base3"

class oldBase4(oldBase1):  
    def foo(self): print "Base4"

class oldDerived1(oldBase2,oldBase3):  
    pass

class oldDerived2(oldBase2,oldBase4):  
    pass

instance = oldDerived1()  
instance.foo()  
# print oldDerived1.__mro__  

instance = oldDerived2()  
instance.foo()  
# print oldDerived2.__mro__  

这一段代码的输出是:

Base1
(<class '__main__.Derived1'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
Base4
(<class '__main__.Derived2'>, <class '__main__.Base2'>, <class '__main__.Base4'>, <class '__main__.Base1'>, <type 'object'>)
-------------
Base1
Base1

其中有一个典型的方法是__mro__,这个方法是新式类(继承object)才有的,全名含义是Method Resolution Order,方法解析顺序。
Guido van Rossum写过一篇history类型的文章,描述了python类继承算法的发展过程,此处是中文翻译版
看完感觉采用新的算法后会引发歧义的继承逻辑都将不被允许。
C++多重继承貌似也很奇葩,写了一些很不规范的测试代码:

#include <iostream>
using namespace std;
class Base1{ 
// public: 
//     void foo(){
//         cout<<"base1"<<endl;
//     }
}; 

class Base2:public Base1{  
};

class Base3:public Base1{
// public:
//     void foo(){
//         cout<<"base3"<<endl;
//     }
};

class Derived:public Base2, public Base3{

};

int main(){
    Derived *instance = new Derived();
    instance->foo();
    return 0;
}

C++不是太懂,暂不多说了。

总结一些最佳实践:
首先,不要混用旧式和新式类,全部使用继承于object的新式类;
其中类继承使用的算法叫C3线性化算法(别问我这是啥,我才不会去看学术论文呢),新式类的__mro__特性存储了线性化计算的结果,你可以调用a.mro()或者a.__mro__获得这个结果;
如果继承关系很复杂的话,最好查看一下mro确认方法解析的顺序是否符合预期;
用设计模式代替多重继承,想想java也是没有多重继承的

Tags :

One thought on “python中的类继承问题”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Click the right image To submit your comment: