2010-10-19 1 views
3

Например, если я декорирования метод, как такМожно ли определить, какой класс является функцией?

def my_decorator(fn): 

    # Do something based on the class that fn is a method of 

    def decorated_fn(*args, **kwargs): 
     fn(*args, **kwargs) 

    return decorated_fn 

class MyClass(object): 

    @my_decorator 
    def my_method(self, param): 
     print "foo" 

Можно ли в my_decorator, чтобы определить, где п пришел?

+1

Это может быть полезно: http://stackoverflow.com/questions/3564049/decorator-changing-function-status-from-method-to-function/3564110#3564110 – carl

ответ

3

Короткий ответ: Нет

Более длинный ответ: Вы можете сделать это отводом о в трассировке стека (см inspect модуль), но это не хорошая идея.

Полный ответ: В то время, когда функция украшена, она по-прежнему является несвязанной функцией. Попробуйте следующее:

def my_dec(fn): 
    print dir(fn) # Has "func_code" and "func_name" 
    return fn 

class A(object): 
    @my_dec 
    def test(self): 
     pass 

print dir(A.test) # Has "im_class" and "im_self" 

Вы можете видеть, что функция сырья переходит в руках декоратора, в то время как связанная функция доступна после объявляются класс.

Способ выполнения этого заключается только в декораторе функции в сочетании с metaclass или class decorator. В любом случае, декоратор функции может установить флаг в функции, а метакласс или класс декоратор может искать его и делать соответствующую вещь.

1

Нет. Вам придется отложить его до тех пор, пока не назовется decorated_fn().