Python 何时使用super(基类,self)。\uuuu init\uuuuuu
在Python中何时应使用以下代码 (假设基类从父类继承,父类有一些在\uuuu init\uuu()方法中启动的变量)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
此代码是否使父类的\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!"
>>>