通常,super在Python中的工作方式如下:
class SubClass(MyParentClass):
def __init__(self):
super(**SubClass**, self).__init__()
但是最近我发现类似以下内容的东西也有用吗?没有崩溃,行为符合预期:
class SubClass(MyParentClass):
def __init__(self):
super(**MyParentClass**, self).__init__()
为什么?第二种情况是什么意思?
答案 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
实例。