我遇到Python(2.7)继承问题。我正试图从派生类引用父母和后退,这很容易,如果你硬编码类,但这对我来说似乎是一个丑陋的方法。是吗?无论如何,我们走了:
class Alpha(object):
def fie(self):
pass
class Beta(Alpha):
def fie(self):
super(self.__class__, self).fie()
class Gamma(Beta):
pass
Alpha().fie()
Beta().fie()
Gamma().fie()
最后一个按fie
上的定义调用Beta
,但由于它是从Gamma
调用的,super
将引用Beta
。因此它会再次调用自己并开始无限递归。
有没有办法引用最初定义函数的类?或者最高级的班级(object
除外)?或者可能是一种更好的方法来实现这一点而不需要对类名进行硬编码?
答案 0 :(得分:4)
不 - 你必须把它写成:
class Beta(Alpha):
def fie(self):
super(Beta, self).fie()
请参阅:http://yergler.net/blog/2011/07/04/super-self/ - 并从那里引用(因为它比我能解释得更好!):
根据Python 2.7.2标准库文档,super“return [s]一个代理对象,它将方法调用委托给父类或兄弟类的类型。”因此,在单继承的情况下,它委托访问超类,它不返回超类的实例。在上面的示例中,这意味着当您实例化B时,会发生以下情况:
enter B.__init__()
call super on B and call __init__ on the proxy object
enter A.__init__()
call super on self.__class__ and call __init__ on the proxy object
问题在于,当我们进入第四步时,自我仍然引用我们的B实例,所以再次调用超级点回到A.技术术语:Ka-bloom。
在该文章中,链接到Raymond Hettinger的博客(他们总是值得一读):http://rhettinger.wordpress.com/2011/05/26/super-considered-super/
注意:请阅读评论,其中用户建议使用type(self)
(相当于您自己的._ 类 _)及其无效的原因 < / p>