• 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!

  • 相关阅读:
    jmeter非GUI模式命令
    jmeter性能测试--浪涌测试
    性能测试之场景设计
    性能测试用例实例
    jmeter常见错误及解决方法
    .NET中变量生存期
    SQL数据库从高版本导入低版本
    对称子字符串
    回溯法求解全排列问题(可去除重复排列)
    快速排序及快速选择问题
  • 原文地址:https://www.cnblogs.com/fuzzier/p/7831228.html
Copyright © 2020-2023  润新知