Python下的多继承

来源:互联网 发布:杭州半径圈网络创始人 编辑:程序博客网 时间:2024/06/09 16:47

(本文不是告诉你怎么样使用Python多继承的)

学过C++和java的同学都知道,C++中的多继承让人很混乱,而java中使用接口实现多继承让人感觉踏实多了。一直听说Python是一门很优美的语言,但是我在学习的过程中遇到了不少坑,其中之一就是Python的多继承。Python的多继承会很容易导致某些父类的__init__方法被调用多次的情况,而且也不能在在子类的__init__方法中分别同时调用不同的基类的__init__方法,如下代码所示:

# coding: utf-8__author__ = 'liuzhenhua'class Parent1(object):    def __init__(self, x):        self.x = x                class Parent2(object):    def __init__(self, a, b):        self.a = a        self.b = b                class SubClass(Parent1, Parent2):    def __init__(self, x, a, b):        # 我想要使用SubClass的__init__方法传进来的三个参数来分别构造Parent1的__init__和Parent2的__init__,        # 但是下面的代码做不到,使用super不能指定具体调用哪个父类的__init__方法(也不能指定调用哪个父类的其他方法)        super(SubClass, self).__init__(x, a, b)        # 可以使用下面两行代码来指定分别调用两个父类的__init__方法,但是这时会造成其他问题,这里就不讨论了        # Parent1.__init__(self, x)        # Parent2.__init__(self, a, b)    

另外,就我个人而言,我特别不喜欢多继承,在学Python的时候我特别怀念Java和C#的接口。

多继承虽然比较灵活,功底好的coder可以发挥出多继承的优势,但是很多代码不是一个人写的,另外往往写代码和维护代码的人不是同一个人,其他人不知道你的类的继承顺序就会引发很多问题,打乱你的类的继承结构,从而可能导致有些间接父类没有被初始化,或者被初始化多次。所以我认为对于Python的多继承,我们应该把他当做单继承来用,其他的父类就退化成java中的接口,使用接口的功能,这样一来就又变成可控的java的感觉了。


下面的代码是将Python的多继承用做接口的例子,将SubClass的第二个父类当做一个接口,在SubClass里面重写接口中方法:

# coding: utf-8__author__ = 'liuzhenhua'class Parent1(object):    def __init__(self, x):        self.x = xclass Interface1(object):    def interface_method(self):        passclass SubClass(Parent1, Interface1):    def __init__(self, x):        super(SubClass, self).__init__(x)    def interface_method(self):        print "这是实现自接口类的方法"        print self.xclass Main(object):    def __init__(self, interface):        self.interface = interface    def invoke(self):        if self.interface is not None and isinstance(self.interface, Interface1):            self.interface.interface_method()        else:            print '参数错误为None或者参数类型错误'sub_class = SubClass(10)main = Main(sub_class)main.invoke()


0 0
原创粉丝点击