super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。
普通继承
复制代码 代码如下:
class FooParent(object):
def __init__(self):
self.parent = ‘I\’m the parent.’
首先看一下super()函数的定义:
super([type [,object-or-type]])
Return a **proxy object** that delegates method calls to a **parent or sibling** class of type.
返回一个代理对象, 这个对象负责将方法调用分配给第一个参数的一个父类或者同辈的类去完成.
parent or sibling class 如何确定?
第一个参数的__mro__属性决定了搜索的顺序, su
什么是MRO
Method Resolution Order , 定义了Python中多继承存在的情况下,解释器查找函数解析的具体顺序
什么是函数解析顺序
# 经典继承问题 - 棱形继承
class A:
def who_am_i(self):
print("i am A")
class B:
pass
class C:
def who_am_i(self):
print("i am A")
class D(B, C):
pass