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

原文地址:https://www.cnblogs.com/geeklove01/p/9048180.html

时间: 2024-10-11 03:51:35

Python多继承中的一些问题的相关文章

Python进阶-继承中的MRO与super

摘要本文讲述Python继承关系中如何通过super()调用"父类"方法,super(Type, CurrentClass)返回CurrentClass的MRO中Type的下一个类的代理:以及如何设计Python类以便正确初始化. 1. 单继承中父类方法调用 在继承中,调用父类方法是很有必要的.调用父类方法的场景有很多: 比如必须调用父类的构造方法__init__才能正确初始化父类实例属性,使得子类实例对象能够继承到父类实例对象的实例属性: 再如需要重写父类方法时,有时候没有必要完全摒

python多继承中MRO问题

主要参考 http://python.jobbole.com/85685/ 算法更新顺序 DFS : 存在多继承中无法重写问题 BFS:存在继承单调性问题 C3算法:算法像是 拓扑排序+优先最左 的方式 原文地址:https://www.cnblogs.com/fuzzier/p/9897404.html

python多继承中子类访问祖先类的同名成员

子类调用父类的同名成员 方式1: class A: def f_a(self): print("----A----") class B: def f_a(self): print("----B----") class C(A, B): def f_a(self): A.f_a(self) # 子类调用父类同名方法,括号里要写self,表明这是一个类调用 B.f_a(self) # 但这样如果修改了父类方法,那么子类就要多处修改 print('----C----')

python多继承

http://blog.csdn.net/pipisorry/article/details/46381341 There are two typical use cases forsuper: In a class hierarchy withsingle inheritance, super can be used to refer to parent classes withoutnaming them explicitly, thus making the code more maint

Python之继承

继承是所有开发语言的必修内容,而本文写的只是Python继承中的特殊之处,关于继承概念及内容可以自行百度(不装B,感觉百度挺好的) 1.构造函数: 要说继承,先要说一下构造函数.Java要求是与类名相同并且无返回值,而Python则是强制要求命名为"__init__()". 当创建类的对象时,会自动先调用构造函数,一般用于初始化.构造函数可以不写,那么程序会隐式自动增加一个空的构造函数. 2.继承写法: (1).class 空格 类名称 括号内填写父类名 冒号 具体写法如下 class

Python历史以及Python在编程语言中的定位

提及阿姆斯特丹你可以联想到郁金香,也可以联想到关于荷兰的一些东东,当然你如果是计算机爱好一族的话,你就一定会关心Python历史,以下就有关于Python历史的介绍. AD: 以本人的观点看来,Python这种语言是非常优美和强大在实际的应用中,是由专门为非专业程序员设计的计算机语言,而拥有很优美的语言Python为什么会用Python命名呢?如果你想对其有所了解,你也不妨看看关于Python历史的介绍. Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹

python基础——继承实现的原理

python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self): print('from B') class C(A): def test(self): print('from C') class D(B): def test(self): print('from D') class E(C): def test(self): print('from E')

[py]python的继承体系

python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done!' class MetaClass(type): def __init__(cls, name, bases, attrs): print('Defining %s' % cls) print('Name: %s' % name) print('Bases: %s' % (bases,)) pri

转 -- Python: 多继承模式下 MRO(Method Resolution Order) 的计算方式关乎super

大家可能已经知道了,在 Python 3(Python 2 的新式类)中多继承模式是使用 C3 算法来确定 MRO(Method Resolution Order) 的. 那么具体是怎么计算的呢?本文将基于 https://www.python.org/downlo... 中的几个例子来讲解 MRO 是怎么计算的. 我们首先来定义一些符号: : 用 CN 表示一个类:C1, C2, C3, ..., CN C1 C2 C3 ... CN 表示的是一个包含多个类的列表 [C1, C2, C3, .