Декораторы функции элемента Python используют экземпляр в качестве параметра

Как использовать экземпляр в качестве параметра в декораторах функции элемента python. Ниже приведен пример.

def foo(func):
    def wrap(s):
        func()
        s.ma()
    return wrap

class A:
    def ma(self):
        print "this is ma"

    @foo(self)     #error.name 'self' is not defined
    def mb(self):
        print "this is mb"
2
nl ja de
Вы не можете, так как не только экземпляр, но класс еще не определен, пока выполняется блок класса. Что вы пытаетесь достичь, заставляет вас думать, что вам нужно это делать?
добавлено автор BrenBarn, источник
Кроме того, ваш foo decorator не настроен для принятия аргументов. Вы просто хотите иметь ссылку на экземпляр в вашей функции foo decorator? Параметр wrap s будет привязан к экземпляру, вы должны передать его на func , как в func (s) .
добавлено автор Thomas, источник

1 ответы

Непонятно, что вы ищете, но если вы хотите использовать ссылку на экземпляр внутри вашего декоратора:

def foo(func):
    def wrap(s): # I'd call this 'self' instead of 's' to remind us it's a reference to an instance

        func(s) # This is a function, not a method yet - so we need to pass in the reference

        s.ma() # This is a method, because you use attribute lookup on the object s to get it
    return wrap

class A:
    def ma(self):
        print "this is ma"

    @foo     # if the way foo wraps mb doesn't depend on some arg, don't use args here
    def mb(self):
        print "this is mb"

Я думаю, вы здесь не поняли разницу между методами и функциями в Python - вы, похоже, ожидаете, что func будет работать как метод, когда на самом деле он будет оставаться функцией при ее оформлении. Это украшенная функция, которая при поиске атрибута на экземпляре будет превращена в метод; это означает, что вам все еще нужно явное я, когда вы вызываете func в вашу функцию обертки.

Посмотрите потрясающий ответ на Как создать цепочку декораторов функций? для лучшего объяснения о том, что происходит.

1
добавлено
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community