Python下的多继承

(本文不是告诉你怎么样使用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 = x


class Interface1(object):
    def interface_method(self):
        pass


class SubClass(Parent1, Interface1):
    def __init__(self, x):
        super(SubClass, self).__init__(x)

    def interface_method(self):
        print "这是实现自接口类的方法"
        print self.x


class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值