本文参考 HuangHuang 的文章 原文地址 https://segmentfault.com/a/1190000008150517
1 super
1.1 super是一个内置类,可以参考__builtin__中的 super 类
class super(object): #... def __init__(self, type1, type2=None): # known special case of super.__init__ """ super(type, obj) -> bound super object; requires isinstance(obj, type) super(type) -> unbound super object super(type, type2) -> bound super object; requires issubclass(type2, type) Typical use to call a cooperative superclass method: class C(B): def meth(self, arg): super(C, self).meth(arg) # (copied from class doc) """ pass @staticmethod # known case of __new__ def __new__(S, *more): # real signature unknown; restored from __doc__ """ T.__new__(S, ...) -> a new object with type S, a subtype of T """ pass #....
这里主要选取super类创建对象时候主要适用的方法 __new__ 和 __init__
__new__ 方法是创建了一个 super 对象
__init__ 是对对象初始化, 而提供初始化的三种方式,这只说明第一个
super(type, obj) -> bound super object; requires isinstance(obj, type) 这种方式是最常见的,将 type类 绑定在 对象 上
1.2 super的工作
super(type, obj) 提供了一个 MRO,super 返回 MRO之后类 中查找的 对象。
super 是从 MRO 的 tail 进行查找, 例如
MRO:[D, C, B, A, object]
super(B, obj) 将会从 B之后查找,即:A, object 。
2 多继承
python新式类object会应用super所以先介绍super
下面多继承示例,代码自己写,逻辑表达方式参考HuangHuang
class A(object): def go(self): # 第四步 # 来之 C.add 中的 super # 此时的self是类D的对象d, self == d # 第五步 # 打印A go print "go A go!" class B(A): def go(self): # 第二步 # 来之 D.add 中的 super # 此时的self是类D的对象d, self == d # self的MRO:[D, B, C, A, object] # self 会从[C, A, object]的顺序查找go方法 super(B, self).go() # 第七步 # 打印B go print "go B go!" class C(A): def go(self): # 第三步 # 来之 B.add 中的 super # 此时的self是类D的对象d, self == d # self的MRO:[D, B, C, A, object] # self 会从[A, object]的顺序查找go方法 super(C, self).go() # 第六步 # 打印C go print "go C go!" class D(B, C): def go(self): # 第一步 # self的MRO:[D, B, C, A, object] # self 会从[B, C, A, object]的顺序查找go方法 super(D, self).go() # 第八步 # 打印D go print "go D go!" print D.mro() d = D() d.go()
out:
[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <type 'object'>] go A go! go C go! go B go! go D go!
程序执行图
over!