代码之家  ›  专栏  ›  技术社区  ›  WhatABeautifulWorld

进错班还管用吗?

  •  0
  • WhatABeautifulWorld  · 技术社区  · 6 年前

    在Python中,通常超级工作如下:

    class SubClass(MyParentClass):
        def __init__(self):
            super(**SubClass**, self).__init__()
    

    但是最近我发现像下面这样的东西也有用吗?无碰撞,行为符合预期:

    class SubClass(MyParentClass):
        def __init__(self):
            super(**MyParentClass**, self).__init__()
    

    3 回复  |  直到 6 年前
        1
  •  3
  •   Adelina    6 年前

    super(MyParentClass, self).__init__()

    class BaseClass:
        def __init__(self):
            print("BaseClass")
    
    
    class MyParentClass(BaseClass):
    
        def __init__(self):
            print("MyParentClass")
    
    
    class SubClass(MyParentClass):
        def __init__(self):
            super(SubClass, self).__init__()
    
    
    class SubClassTwo(MyParentClass):
        def __init__(self):
            super(MyParentClass, self).__init__()
    
    
    SubClass() # output: MyParentClass
    SubClassTwo()  # output: BaseClass
    
        2
  •  1
  •   Andrej Kesely    6 年前

    实际上,他们的行为是不一样的。

    根据 super() docs here ):

    类型的兄弟类。

    class MyParentClass:
        def __init__(self):
            print('MyParentClass.__init__ called!')
    
    class SubClass(MyParentClass):
        def __init__(self):
            super(MyParentClass, self).__init__()
    

    电话:

    super(MyParentClass, self).__init__()
    

    MyParentClass object .

    如果您打电话:

    super(SubClass, self).__init__()
    

    它将打印:

    MyParentClass.__init__ called!
    

    因为 SubClass 我的父类 .

        3
  •  0
  •   Patrick Haugh    6 年前

    The documentation for super says (in part):

    super([type[, object-or-type]])

    type . 这对于访问继承的方法很有用 在类中被重写的。搜索顺序与此相同 使用人 getattr()

    所以 super(MyParentClass, self) 解析为将方法调用传递给的父级和同级的代理对象 MyParentClass

    class MyParentClass:
        def __init__(self, **kwargs):
            ...
            super(MyParentClass, self).__init__(kwargs)
    

    当你做一个 SubClass 对象 self 超级的 子类