自参数和元编程
好吧,代码更能说明问题(我对一些东西进行了硬编码,以隔离问题并使问题更短):
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。但我认为我需要用类来做到这一点,因为我需要存储一些附加信息(如元数据)(这是我真正问题的简化版本)。这可能吗?如果可能的话,如何实现?很抱歉一开始没有指定这一点。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使用函数包装器,而不是一类。关闭将处理剩下的事情:
Use function wrapper, instead of class one. Closure will take care of the rest:
将
wrapper
设为 描述符,以便您知道被戳的具体实例。Make
wrapper
a descriptor so that you know the specific instance being poked.您可以使您的
wrapper
类成为非数据描述符,如 函数和方法 部分rel="nofollow">描述符操作指南——在这种情况下非常简单,因为它只意味着给类一个__get__()
方法创建并返回所需的包装方法。我的意思是:
使用类意味着您可以根据需要轻松添加其他成员和/或元数据。
You can make your
wrapper
class a non-data descriptor, as described in the Functions and Methods section of Raymond Hettinger's excellent How-To Guide for Descriptors -- which in this case is pretty easy since it just means giving the class a__get__()
method which creates and returns the wrapped method desired.Here's what I mean:
Using a class means you can easily add other members and/or metadata as necessary.