0
0 комментариев

У меня есть некий класс, скажем, MyClass. Я хочу сделать декоратор для метода этого класса (и некоторых других). В декораторе мне хотелось бы иметь ссылку на объект этого класса.

В Python 2 была замечательная функция inspect.getargspec, которая сейчас (в Pyton 3) является deprecated.

Покапавшись в докуменации я нашел лишь способ узнать есть ли аргумент self в функции или нет.

Вот пример такого поиска:

import inspect
 
 
def get_reference_by_method(f):
    all_args_of_method = inspect.signature(f).parameters
    if 'self' in all_args_of_method:
        print("I've found self!")
    else:
        raise Exception('It is not a class method')
    return None # I don't know how to get a reference on self
 
 
def super_decorator(f):
    def wrapper(*args, **kwargs):
        self = get_reference_by_method(f)
        return f(*args, **kwargs)
    return wrapper
 
class MyClass:
 
    @super_decorator
    def decorating_method(self):
        print('Hello from the decorating method')
 
MyClass().decorating_method()

Вывод в консоль:

I've found self!
Hello from the decorated method

Не могу понять, что мне надо сделать, чтобы получить этот self.


Добавить комментарий