何时应在Python中使用以下代码 (假设Baseclass继承自Parent类,而Parent类在 __ init __ ()方法中启动了一些变量)
class Baseclass(Parent):
def __init__(self, some_arg):
self.some_arg = some_arg
super(Baseclass, self).__init__()
此代码是否可以在Baseclass中访问父类的 __ init __ 方法中定义的所有局部变量?它有什么意义?
答案 0 :(得分:6)
super
可防止您的代码重复;复杂的__init__
无需进入您的继承类。它还使MRO正常工作,这样如果你使用多重继承,它将正常工作。
这样做的一个原因是确保所有继承对象都具有父级不具备的某些属性。如果你只是写一个新的__init__
,除非你重复你的代码,否则他们不会拥有它们。例如:
>>> class A(object):
... def __init__(self, x):
... self.x = x
...
>>> class B(A):
... def __init__(self, y):
... self.y = y
...
>>> Stick = B(15)
>>> Stick.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'B' object has no attribute 'x'
>>>
在super
期间不调用__init__
,只会覆盖整个方法。在此处调用super
可确保继承的类中存在这两个变量。
>>> class C(A):
... def __init__(self, x, y):
... super(C, self).__init__(x)
... self.y = y
...
>>> Dave = C(15, 22)
>>> Dave.x
15
>>> Dave.y
22
>>>
请注意,在super
来电中,x
会传递给__init__()
来电,但self
会在super(C, self)
部分进行处理。代码。
编辑:TyrantWave也正确地指出super
在__init__
之外也非常有用。例如,使用简单的foo
方法获取对象。
class Parent(object):
def foo(self):
return "I say foo!"
继承的类可能只想改变此函数的输出而不是完全重写它。因此,我们不是重复自己并重复编写相同的代码,而是调用super
来获取父级的返回值,然后使用数据并返回子类的修改结果。< / p>
class Child(Parent):
def foo(self):
parent_result = super(Child, self).foo()
return "I'm a child!! %s" % parent_result
在上文中,对super
的调用会返回Parent
的{{1}}值,然后foo()
继续处理数据,然后再返回
Child