Gio*_*lia 4 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
Run Code Online (Sandbox Code Playgroud)
然后我定义了一个看起来像这样的类:
class MyClass(object):
def __init__(argument):
self.argument = argument
@my_decorator(self.argument) # !this is an error!
def my_method(self):
.... # does something
Run Code Online (Sandbox Code Playgroud)
显然我写的是错误的,因为在装饰器级别我无法访问self,但是解决这个问题的正确方法是什么?
您可以在self.argument内部拥有装饰器访问权限wrapped_f:
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
Run Code Online (Sandbox Code Playgroud)
如果传递的变量argument根据被装饰的函数发生变化,您可以将其作为字符串传递给装饰器并用于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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3427 次 |
| 最近记录: |