什么时候超级(Baseclass,self).__ init__使用

时间:2014-05-06 14:04:30

标签: python class super

何时应在Python中使用以下代码 (假设Baseclass继承自Parent类,而Parent类在 __ init __ ()方法中启动了一些变量)

class Baseclass(Parent):
    def __init__(self, some_arg):
        self.some_arg = some_arg
        super(Baseclass, self).__init__()

此代码是否可以在Baseclass中访问父类的 __ init __ 方法中定义的所有局部变量?它有什么意义?

1 个答案:

答案 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