Python下的多继承
2014-12-06 23:22
183 查看
(本文不是告诉你怎么样使用Python多继承的)
学过C++和java的同学都知道,C++中的多继承让人很混乱,而java中使用接口实现多继承让人感觉踏实多了。一直听说Python是一门很优美的语言,但是我在学习的过程中遇到了不少坑,其中之一就是Python的多继承。Python的多继承会很容易导致某些父类的__init__方法被调用多次的情况,而且也不能在在子类的__init__方法中分别同时调用不同的基类的__init__方法,如下代码所示:
另外,就我个人而言,我特别不喜欢多继承,在学Python的时候我特别怀念Java和C#的接口。
多继承虽然比较灵活,功底好的coder可以发挥出多继承的优势,但是很多代码不是一个人写的,另外往往写代码和维护代码的人不是同一个人,其他人不知道你的类的继承顺序就会引发很多问题,打乱你的类的继承结构,从而可能导致有些间接父类没有被初始化,或者被初始化多次。所以我认为对于Python的多继承,我们应该把他当做单继承来用,其他的父类就退化成java中的接口,使用接口的功能,这样一来就又变成可控的java的感觉了。
下面的代码是将Python的多继承用做接口的例子,将SubClass的第二个父类当做一个接口,在SubClass里面重写接口中方法:
学过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()
相关文章推荐
- Python入门的36个例子 之 32 -> OOP – Inheritance 继承
- C++ Boost 之Python(继承)
- python 类继承的使用
- Python多重继承
- Python2.7 学习笔记 (三)—— 类,继承,重载
- python继承机制探讨
- python多重继承
- python中的多继承
- Python入门:类的继承与实现
- Python中的类型关系和继承关系
- [Dynamic Language] Python Django: 模板引擎(4)在视图中使用模板和模板继承
- python基础4--继承
- Python 笔记 : 类和继承
- Python中的继承
- 菜鸟说python中的继承
- python支持多重继承
- python 多继承(2)
- python中的继承和抽象类的实现
- python 类继承
- python中的多继承