python不能多继承吗_Python多继承中的一些问题

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

在多继承中,如何访问父类中某个属性,是按照__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__决定:

classA(object):def __init__(self):

self.a= 1

print 'A'

defsing(self):print 'sing A'

classB(object):def __init__(self):print 'B'

classC(A, B):def __init__(self):print 'C'c=C()

c.sing() # okprint 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值