调用变量超类方法

2024-06-16 09:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用变量方法名来调用超类的方法。通常,我认为以下两行代码是等效的:

someObj.method()
someObj.__getattribute__( 'method' )()

事实上,我相信,当我使用第一行时,也会发生这种情况。然而,在下面的例子中,第二行产生了一个奇怪的问题。在

我使用^{}构造一个超级对象并调用超类的方法。直接这样做可以像预期的那样工作,但是使用__getattribute__先获取方法,会导致一个不确定的循环,该循环反复调用子类的方法。在

参见以下代码:

^{pr2}$

如果运行该代码,则一切都按预期工作,并且您应该得到类似以下内容的输出:

<bound method B.example of <__main__.B object at 0x01CF6C90>>
<bound method B.example of <__main__.B object at 0x01CF6C90>>
example in A
example in B

所以这两种方法,一种是直接访问的,另一种是通过__getattribute__,看起来是一样的。但是,如果将方法调用替换为注释掉的行,则最终将出现递归运行时错误。在

为什么会发生这种情况,更重要的是,当我使用工作行时,我如何以python内部相同的方式访问该方法?在

编辑

当我以为我已经试过所有的方法时,我发现这是有效的:

super.__getattribute__( super( B, self ), 'example' )()

它实际上等于super( B, self ).example。在


Tags: of方法代码inselfobjectmainexample
2条回答

获取B对象的example属性将得到B.example的绑定副本。调用此函数将导致递归错误。您调用的A.__getattribute__()是无关的;您仍然有一个B对象。在

不要为此使用__getattribute__:它并没有像您所想的那样做。(它是Python机器的一个特殊部分,主要用于实现新的属性访问魔术)

对于普通属性访问,请使用getattr/setattr/delattr内置函数:

self.example           == getattr(self, 'example')
super(B, self).example == getattr(super(B, self), 'example')

(如果您想了解__getattribute__的作用,请阅读Descriptor HowTo Guide和Python Data model引用。)

相关问题 更多 >