Python多继承中的一些问题

Posted geeklove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多继承中的一些问题相关的知识,希望对你有一定的参考价值。

https://docs.python.org/2/tutorial/classes.html#multiple-inheritance

http://www.jackyshen.com/2015/08/19/multi-inheritance-with-super-in-Python/

http://python.jobbole.com/85685/

在多继承中,如何访问父类中某个属性,是按照__mro__中的顺序确定的。

关于super(),原型是这样的:

super(type[, object-or-type])

note:If the second argument is omitted, the super object returned is unbound. If the second argument is an object, isinstance(obj, type)must be true. If the second argument is a type, issubclass(type2, type) must be true (this is useful for classmethods).

初始化的时候,如果使用了super()(ref:https://docs.python.org/2/library/functions.html#super),

那么会按照__mro__中的顺序初始化遇到的第一个父类

如果想初始化所有父类,就要用显式的方法了,比如,定义类:

A, B, C(A, B)

那么在C中可以这样初始化父类A:

A.__init__(self)

假如没有调用A的构造函数,那么在A的构造函数中定义的变量就不能访问,尽管C是A的子类

因为并没有把A的构造函数中定义的变量绑定在C的实例上

但是A的方法还是可以调用,调用的顺序由__mro__决定:

class A(object):
    def __init__(self):
        self.a = 1
        print A


    def sing(self):
        print sing A

class B(object):
    def __init__(self):
        print B

class C(A, B):
    def __init__(self):
        print C
c = C()
c.sing()   # ok
print c.a  # error

MRO的全称是method resolution order, 它定义了一种在多重继承的情况下依次访问父类的顺序

文档里(https://docs.python.org/2/library/functions.html#super)这样描述MRO:

The __mro__ attribute of the type lists the method resolution search order used by both getattr() and super(). The attribute is dynamic and can change whenever the inheritance hierarchy is updated.

目前Python2.7中的新式类,Python3中的类获取MRO使用的是C3算法(ref:https://en.wikipedia.org/wiki/C3_linearization

 

以上是关于Python多继承中的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

Python多继承中的一些问题

python开发面向对象基础:接口类&抽象类&多态&多继承

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python 继承

python [代码片段]一些有趣的代码#sort

python-- 继承式多线程守护线程