Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用类变量调用decorator_Python_Decorator_Python Decorators - Fatal编程技术网

在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,我只是尝试运行我的示例(我用一些存根代码填充了
部分),它工作得很好。我想我得看看你的代码才能告诉你问题出在哪里。