Python 调用变量超类方法

Python 调用变量超类方法,python,super,superclass,Python,Super,Superclass,我试图通过使用变量方法名来调用超类的方法。通常,我会将以下两行代码视为等效代码: someObj.method() someObj.__getattribute__( 'method' )() 事实上,我相信,这也是我使用第一行时实际发生的事情。但是,在下面的示例中,第二行产生了一个奇怪的问题 我用它来构造一个超对象并调用超类的方法。直接执行此操作可以按预期工作,但是使用\uuuu getattribute\uuuu首先获取方法会导致一个不确定的循环,该循环会一次又一次地调用子类的方法 请参阅

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

someObj.method()
someObj.__getattribute__( 'method' )()
事实上,我相信,这也是我使用第一行时实际发生的事情。但是,在下面的示例中,第二行产生了一个奇怪的问题

我用它来构造一个超对象并调用超类的方法。直接执行此操作可以按预期工作,但是使用
\uuuu getattribute\uuuu
首先获取方法会导致一个不确定的循环,该循环会一次又一次地调用子类的方法

请参阅以下代码:

class A:
    def example ( self ):
        print( 'example in A' )

class B ( A ):
    def example ( self ):
        print( super( B, self ).example )
        print( super( B, self ).__getattribute__( 'example' ) )
        super( B, self ).example()
        #super( B, self ).__getattribute__( 'example' )()

        print( 'example in B' )

x = B()
x.example()
如果您运行该代码,一切都会按预期工作,您应该会得到类似以下内容的输出:

<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

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

获取
B
对象的
example
属性将生成
B.example
的绑定副本。调用此函数将导致递归错误。调用
A.\uuu getattribute\uuuu()
是不相关的;您仍然有一个
B
对象。

获取
B
对象的
example
属性将生成
B.example
的绑定副本。调用此函数将导致递归错误。调用
A.\uuu getattribute\uuuu()
是不相关的;您仍然有一个
B
对象。

不要使用
\uuuu getattribute\uuuu
,因为它不会做您认为它会做的事情。(它是Python机器的一个专门部分,主要用于实现新的属性访问魔术。)

对于正常属性访问,请使用内置的
getattr
/
setattr
/
delattr

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

(如果您想了解
\uuuu getattribute\uuuu
的作用,请阅读和Python参考。)

不要使用
\uuu getattribute\uuuu
,因为它不会做您认为它会做的事情。(它是Python机器的一个专门部分,主要用于实现新的属性访问魔术。)

对于正常属性访问,请使用内置的
getattr
/
setattr
/
delattr

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

(如果你想了解
\uu getattribute\uuu
的功能,请阅读和Python参考。)

你不应该使用
getattr(obj,'attrname')
而不是
obj.\uu getattr\uuuu('attrname')
?哦,你说得对!由于某种原因,当它实际上相当于
getattr(obj,'x')
时,我认为
obj.x
相当于
obj.\uuu getattribute('x')
。然而,
getattr
会有什么样的魔力呢另外,你可能想把它作为一个答案发布。重复:,你不是应该使用
getattr(obj,'attrname')
而不是
obj.\uu getattr(attrname')
?哦,你说得对!由于某种原因,当它实际上相当于
getattr(obj,'x')
时,我认为
obj.x
相当于
obj.\uuu getattribute('x')
。然而,
getattr
会有什么样的魔力呢此外,您可能希望将其作为答案发布。重复项:,