下面是成员函数装饰器的最小示例:
def wrap_function(func):
def wrapper(*args, **kwargs):
print(args)
print(kwargs)
return wrapper
class Foo:
@wrap_function
def mem_fun(self, msg):
pass
foo = Foo()
foo.mem_fun('hi')
输出:
(<__main__.Foo object at 0x7fb294939898>, 'hi')
{}
所以 self
是 args
之一.
但是当使用包装类时:
class WrappedFunction:
def __init__(self, func):
self._func = func
def __call__(self, *args, **kwargs):
print(args)
print(kwargs)
def wrap_function(func):
return WrappedFunction(func)
class Foo:
@wrap_function
def mem_fun(self, msg):
pass
foo = Foo()
foo.mem_fun('hi')
输出是:
('hi',)
{}
所以 self
,它引用了 Foo
对象,在 __call__
的正文中不可访问的 WrappedFunction
对象。
我怎样才能在那里访问它?
最佳答案
通过包装函数逻辑(而不是实例)并将其重定向到类实例,您将丢失对有界实例的引用 - 此时,类实例自己的 self
应用而不是包装的实例方法,因为它在中间装饰器 (wrap_function()
) 中丢失。
您要么必须包装对包装函数的调用并将 *args
/**kwargs
传递给它,要么只创建一个适当的包装类而不是添加一个中间包装器:
class WrappedFunction(object):
def __call__(self, func):
def wrapper(*args, **kwargs):
print(args)
print(kwargs)
# NOTE: `WrappedFunction` instance is available in `self`
return wrapper
class Foo:
@WrappedFunction() # wrap directly, without an intermediary
def mem_fun(self, msg):
pass
foo = Foo()
foo.mem_fun('hi')
# (<__main__.Foo object at 0x000001A2216CDBA8>, 'hi')
# {}
关于python - 成员函数装饰器和 self 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722976/