@Ohotnikx

Как работает в данном примере декорирование?

Нарыл на статье хабра примерно похожий код на тему декораторов:
def decor(func): 
    def _wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result
    return _wrapper 

class MyClass:
    def complex_calculation(self):
        return 42

MyClass = decor(MyClass)

my_obj = MyClass()

print(my_obj.complex_calculation())


Я пытался в нем разобраться но стопорился об одно: в строке my_obj = MyClass() вроде как создается экземпляр класса MyClass. Однако строкой выше происходит декорирование и MyClass становится ссылкой на функцию _wrapper. Т.е. по сути, в этой строке должен в качестве аргумента приниматься класс, чтобы result стал экземпляром класса, но класс как аргумент передавался только при вызове decor() строкой еще выше и (наверное) не играл никакой роли. Заранее спасибо!
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Не очень понятно, а что не понятно. Передается объект класса в функцию, ты зачем назвал параметр функции func а передаешь туда объект класса. Вот здесь result = func(*args, **kwargs) ты инициализируешь экземпляр класса, затем возвращаешь его да и все, MyClass у тебя стала функцией которая возвращает экземпляр класса. Ну добавь там чего нибудь например.
def f():
    return 100
    
def decor(func): 
    def _wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        result.complex_calculation = f
        return result
    return _wrapper 

class MyClass:
    def complex_calculation(self):
        return 42

MyClass = decor(MyClass)

my_obj = MyClass()

print(my_obj.complex_calculation())

Твой метод вернет, не 42, а 100. Или объяви метод какой-нибудь которого нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы