通过错误的课程仍然有效吗?

时间:2018-08-03 19:23:00

标签: python super

通常,super在Python中的工作方式如下:

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

但是最近我发现类似以下内容的东西也有用吗?没有崩溃,行为符合预期:

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

为什么?第二种情况是什么意思?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

实际上,行为并不相同。

摘自file arm-linux-androideabi-ld docs here)的文档:

  

返回将方法调用委托给父对象或对象的代理对象   类型的同级类。

所以,如果您有:

arm-linux-androideabi-ld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped

通话:

super()

无效,因为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!

答案 2 :(得分:0)

The documentation for super says (in part):

  

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/layout_background"> <ImageView android:id="@+id/img_background" android:layout_width="match_parent" android:layout_height="108dp" android:background="@color/up" android:src="@mipmap/ic_launcher" /> <de.hdodenhof.circleimageview.CircleImageView android:id="@+id/nav_header_view_profilePic" android:layout_width="108dp" android:layout_height="108dp" android:layout_below="@+id/img_background" android:src="@drawable/profile" android:layout_marginTop="-54dp" android:layout_centerHorizontal="true" /> </RelativeLayout>

     

返回将方法调用委托给父对象或对象的代理对象   super([type[, object-or-type]])的同级类。这对于访问继承的方法很有用   在一个类中被覆盖。搜索顺序与此相同   由type使用,只是类型本身被跳过。

因此getattr()解析为一个代理对象,该代理对象将方法调用传递给super(MyParentClass, self)的父级和同级。它起作用并不奇怪。如果您的父班是

MyParentClass

然后,当您创建class MyParentClass: def __init__(self, **kwargs): ... super(MyParentClass, self).__init__(kwargs) 对象时,SubClass self调用中的MyParentClass是一个super实例。