Python 何时使用super(基类,self)。\uuuu init\uuuuuu

Python 何时使用super(基类,self)。\uuuu init\uuuuuu,python,class,super,Python,Class,Super,在Python中何时应使用以下代码 (假设基类从父类继承,父类有一些在\uuuu init\uuu()方法中启动的变量) 此代码是否使父类的\uuuuu init\uuuu方法中定义的所有局部变量都可以在基类中访问?它有什么意义?super防止代码重复;一个复杂的\uuuu init\uuuu不需要c/p'ed到您的继承类中。它还使MRO正常工作,这样,如果您使用多重继承,它将正常工作 这样做的一个原因是确保所有继承对象都具有某些属性,而这些属性不是来自父对象的。如果您只需编写一个新的\uuuu

在Python中何时应使用以下代码 (假设基类从父类继承,父类有一些在\uuuu init\uuu()方法中启动的变量)


此代码是否使父类的\uuuuu init\uuuu方法中定义的所有局部变量都可以在基类中访问?它有什么意义?

super
防止代码重复;一个复杂的
\uuuu init\uuuu
不需要c/p'ed到您的继承类中。它还使MRO正常工作,这样,如果您使用多重继承,它将正常工作

这样做的一个原因是确保所有继承对象都具有某些属性,而这些属性不是来自父对象的。如果您只需编写一个新的
\uuuuu init\uuuuu
,除非您重复代码,否则他们不会拥有它们。例如:

>>> 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
调用中,
x
被传递给
\uuuu init\uuuu()
调用,但是
self
在代码的
super(C,self)
部分得到处理

编辑:TyrantWave还正确地指出,
super
\uuuu init\uuuu
之外也非常有用。以具有简单
foo
方法的对象为例

class Parent(object):
    def foo(self):
        return "I say foo!"
继承的类可能只想更改此函数的输出,而不是完全重写它。因此,我们不需要重复我们自己并重新编写相同的代码,只需调用
super
来获取父类的返回值,然后处理数据并返回子类的修改结果

class Child(Parent):
    def foo(self):
        parent_result = super(Child, self).foo()
        return "I'm a child!! %s" % parent_result
在上面的例子中,对
super
的调用返回
foo()
Parent
s值,然后
Child
在返回数据之前进一步处理数据

>>> Alan = Parent()
>>> Stan = Child()
>>> Alan.foo()
'I say foo!'
>>> Stan.foo()
"I'm a child!! I say foo!"
>>> 

“在init中定义变量”是什么意思?你指的是实例属性还是局部变量?我指的是局部变量,比如self.some\u variable=some\u variable。另外,你不必只从
super
调用
\uu init\uu
super(B,self)。func(args)
将使用
args
A
调用
func
。这是正确的,这是一个很好的使用示例——我将更新我的答案以包括这一点
class Child(Parent):
    def foo(self):
        parent_result = super(Child, self).foo()
        return "I'm a child!! %s" % parent_result
>>> Alan = Parent()
>>> Stan = Child()
>>> Alan.foo()
'I say foo!'
>>> Stan.foo()
"I'm a child!! I say foo!"
>>>