2014-06-24 27 views
2

可能我以錯誤的方式接近問題,並有一個更簡單的解決方案,但這是我的問題。在Python中調用類變量的裝飾器

我有這樣定義的裝飾:

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 

顯然我寫的是錯了,我無法訪問self,但解決此問題的正確方法是什麼?

回答

2

你可以有裝飾接入self.argumentwrapped_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 

如果變量被作爲視功能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 
+0

我知道我忘記了一些東西!比我想象的要容易得多!謝謝! –

+0

但'self'如何傳遞給'wrapped_f'?我得到一個TypeError:my_method(),缺少1個需要的位置參數:'self''。 – Wtower

+0

@Wtower Python自動將'self'傳遞給'my_method',因爲'my_method()'是'MyClass'的一個實例方法。這聽起來像是你正在裝飾一個普通的函數,它不會自動獲得'self'參數。 – dano