super与多继承

本文参考 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) 提供了一个 MROsuper 返回 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!

posted @ 2017-11-14 10:33  fuzzier  阅读(281)  评论(0编辑  收藏  举报