【发布时间】:2011-06-21 17:49:47
【问题描述】:
好吧,代码说话更多(我已经硬编码了一些东西,以隔离问题并使问题更短):
class wrapper:
def __init__( self, func ):
self.func = func
def __call__( self, *args ):
print( "okay, arg = ", args[0] )
self.func( self, args )
class M( type ):
def __new__( klass, name, bases, _dict ):
_dict[ "f" ] = wrapper( _dict[ "f" ] )
return type.__new__( klass, name, bases, _dict )
class AM( metaclass = M ):
def __init__( self ):
self.a = 0
def f( self, a ):
self.a = a
am = AM()
print( am.a ) # prints 0, expected
am.f( 1 ) # prints: "okay, arg = 1"
print( am.a ) # prints 0 again, also expected
我希望第二个打印显示1,而不是0。换句话说,是否有可能,如果是的话 - 如何将“真实自我”传递给我的包装器?
注意:我知道为什么会打印0,并且我知道这里有什么问题(wrapper 的自我传递,而不是对象,调用f),但我不知道如何解决它。
有什么想法吗?
编辑 - 感谢大家的回答,我 +1。但我认为我需要用类来做这件事,因为我需要存储一些额外的信息(比如元数据)(这是我真正问题的简化版本)。有可能吗?如果有,怎么做?很抱歉没有在一开始就说明这一点。
【问题讨论】: