Можно ли определить, к какому классу относится функция? - PullRequest
3 голосов
/ 20 октября 2010

Например, если я украшаю метод, подобный так

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 определить, откуда появился fn?

Ответы [ 2 ]

3 голосов
/ 20 октября 2010

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

Более длинный ответ : Вы можете сделать это, взломав трассировку стека (см. Модуль 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"

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

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

1 голос
/ 20 октября 2010

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

...