0

我在使用 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定义为 on Beta,但由于它是从调用的Gamma,所以super将引用Beta. 因此,它会再次调用自己并开始无限递归。

有没有办法引用最初定义函数的类?还是链条上最高的班级(除此之外object)?或者可能是一种更好的方法来实现这一点,而无需硬编码类名?

4

1 回答 1

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 “返回 [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

问题是当我们进行到第四步时,self 仍然指向我们的 B 实例,所以再次调用 super 指向 A。用技术术语来说:Ka-bloom。

在那篇文章中是 Raymond Hettinger 的博客链接(它们总是值得一读):http ://rhettinger.wordpress.com/2011/05/26/super-considered-super/

注意:阅读用户建议使用的评论type(self)(相当于你自己。__)以及为什么它不起作用

于 2012-12-23T20:03:57.943 回答