我试图通过使用变量方法名来调用超类的方法。通常,我认为以下两行代码是等效的:
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
。在
获取
B
对象的example
属性将得到B.example
的绑定副本。调用此函数将导致递归错误。您调用的A.__getattribute__()
是无关的;您仍然有一个B
对象。在不要为此使用
__getattribute__
:它并没有像您所想的那样做。(它是Python机器的一个特殊部分,主要用于实现新的属性访问魔术)对于普通属性访问,请使用
getattr
/setattr
/delattr
内置函数:(如果您想了解
__getattribute__
的作用,请阅读Descriptor HowTo Guide和Python Data model引用。)相关问题 更多 >
编程相关推荐