美文网首页
Python多继承

Python多继承

作者: 开罗酒吧 | 来源:发表于2017-05-25 14:35 被阅读0次

摘自python cookbook:

class Base:
  def __init__(self):
    print('Base.__init__')
class A(Base):
  def __init__(self):
    Base.__init__(self)
    print('A.__init__')
class B(Base):
  def __init__(self):
    Base.__init__(self)
    print('B.__init__')
class C(A,B):
  def __init__(self):
    A.__init__(self)
    B.__init__(self)
    print('C.__init__')

如果你运行这段代码就会发现 Base.init() 被调用两次,如下所示:

>>> c = C()
Base.__init__
A.__init__
Base.__init__
B.__init__
C.__init__
>>>

用super():

class Base:
  def __init__(self):
    print('Base.__init__')
class A(Base):
  def __init__(self):
    super().__init__()
    print('A.__init__')
class B(Base):
  def __init__(self):
    super().__init__()
    print('B.__init__')
class C(A,B):
  def __init__(self):
    super().__init__() # Only one call to super() here
    print('C.__init__')

运行这个新版本后,你会发现每个 init() 方法只会被调用一次了:

>>> c = C()
Base.__init_
B.__init__
A.__init__
C.__init__
>>>

为了弄清它的原理,我们需要花点时间解释下Python是如何实现继承的。 对于你定义的
每一个类而已,Python会计算出一个所谓的方法解析顺序(MRO)列表。 这个MRO列表就
是一个简单的所有基类的线性顺序表。例如:

>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>,
<class '__main__.Base'>, <class 'object'>)
>>>

当你使用 super() 函数时,Python会在MRO列表上继续搜索下一个类。 只要每个重定义
的方法统一使用 super() 并只调用它一次, 那么控制流最终会遍历完整个MRO列表,每
个方法也只会被调用一次。 这也是为什么在第二个例子中你不会调用两次
Base.init() 的原因。

相关文章

  • 2018-09-10 day16-类补充总结

    多继承 python支持类的多继承 python进行多继承时,子类能够继承父类的所有字段和方法,但是只能继承第一个...

  • python中的类的继承、多态和运算符重载

    类的继承 1.继承 python中的类支持继承,并且支持多继承。 python中默认情况是继承自object(ob...

  • Python - super()

    参考:Python : super没那么简单 一.单继承 1.Python2 2.Python3 二.多继承

  • python多继承

    我定义了以下三个类,Mother,Father,Son,Son继承了Mother,Father两个类 然后创建So...

  • python多继承

    super(Childen).__init__(self); Person.__init(self) Man.__...

  • Python多继承

    摘自python cookbook: 如果你运行这段代码就会发现 Base.init() 被调用两次,如下所示: ...

  • Python多继承

    https://segmentfault.com/a/1190000004018476python中使用多继承,会...

  • 2018-08-01python学习面向对象(类的继承)

    子类:继承者父类(超类):被继承者1.怎么继承python中类是可以继承的,并且支持多继承 说明:python中所...

  • Python多重继承(拓扑排序)(9)

    Python跟Java不同,Java只能单继承(不过有多实现),而Python能够多重继承。其多重继承遵循拓扑排序...

  • Python基础语法(九)继承

    继承 Python 格式: 私有方法、属性不会被继承,所以子类不能调用父类的方法或属性 多继承 格式: 多继承扩展

网友评论

      本文标题:Python多继承

      本文链接:https://www.haomeiwen.com/subject/maqzxxtx.html