在python中使用类变量调用decorator
也许我处理问题的方式不对,有一个更简单的解决方案,但这是我的问题 我有一个这样定义的装饰师:在python中使用类变量调用decorator,python,decorator,python-decorators,Python,Decorator,Python Decorators,也许我处理问题的方式不对,有一个更简单的解决方案,但这是我的问题 我有一个这样定义的装饰师: def my_decorator(argument): def wrap(f): def wrapped_f(*args, **kwargs): .... # does something with argument return wrapped_f return wrap class MyClass(object): def
def my_decorator(argument):
def wrap(f):
def wrapped_f(*args, **kwargs):
.... # does something with argument
return wrapped_f
return wrap
class MyClass(object):
def __init__(argument):
self.argument = argument
@my_decorator(self.argument) # !this is an error!
def my_method(self):
.... # does something
然后我定义了一个如下所示的类:
def my_decorator(argument):
def wrap(f):
def wrapped_f(*args, **kwargs):
.... # does something with argument
return wrapped_f
return wrap
class MyClass(object):
def __init__(argument):
self.argument = argument
@my_decorator(self.argument) # !this is an error!
def my_method(self):
.... # does something
很明显,我写的是错误的,因为在decorator级别,我无法访问
self
,但是解决这个问题的正确方法是什么呢?您可以让decorator访问self.argument
内部包装
:
def mydecorator(f):
def wrapped_f(self, *args, **kwargs):
argument = self.argument
.... # does something with argument
return f(self, *args, **kwargs)
return wrapped_f
return wrap
如果作为参数传递的变量
根据被修饰的函数而变化,则可以将其作为字符串传递给装饰器,并使用getattr
从self
获取:
def my_decorator(arg_name):
def wrap(f):
def wrapped_f(self, *args, **kwargs):
argument = getattr(self, arg_name)
.... # does something with argument
return wrapped_f
return wrap
class MyClass(object):
def __init__(self, argument):
self.argument = argument
@my_decorator("argument")
def my_method(self):
.... does something
我知道我忘了什么!比我想的容易多了!谢谢但是如何将
self
传递给wrapped\u f
?我得到一个TypeError:my_method()缺少一个必需的位置参数:“self”
@Wtower Python会自动将self
传递给my_method
,因为my_method()
是MyClass
的实例方法。听起来像是在装饰一个常规函数,它不会自动获取self
参数。@dano感谢您的回复。不,我不是想装饰一个常规的功能。错误出现在my_decorator:wrap\u f:wrapped\u f
函数中,我指的是self
@Wtower-Hmm,我只是尝试运行我的示例(我用一些存根代码填充了…
部分),它工作得很好。我想我得看看你的代码才能告诉你问题出在哪里。