【发布时间】:2019-01-14 07:39:45
【问题描述】:
以下成员函数上的装饰器的最小示例:
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',)
{}
因此,引用Foo 对象的self 在WrappedFunction 对象的__call__ 的主体中是不可访问的。
我怎样才能让它在那里访问?
【问题讨论】:
标签: python python-3.x decorator wrapper member-functions