Задать вопрос

Передать в декоратор метода класса сам класс

Вот простой декоратор:

def deco(clazz):
	def dec(fn):
		print clazz,fn
		return fn
	return dec

Пытаемся его использовать:
class Foo(object):
	@deco(Foo)
	def Bar():
		print "bar"

При запуске пишет:
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    class Foo(object):
  File "<pyshell#12>", line 2, in Foo
    @deco(Foo)
NameError: name 'Foo' is not defined

Собственно, почему он не видит класс и как это можно обойти?
  • Вопрос задан
  • 3567 просмотров
Подписаться 4 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 4
AterCattus
@AterCattus
Люблю быстрый backend
Потому что в момент выполнения тела класса, он еще не сформирован.
Можно например так:
import traceback

def deco():
    clazz = traceback.extract_stack()[1][2]
    def dec(fn):
        print clazz,fn
        return fn
    return dec

class Foo(object):
    @deco()
    def Bar():
        print "bar"


Может кто что получше предложит, что-то голова не варит.
Ответ написан
@xSus
Декоратор уровня метода — решает вопросы самого метода. И не корректно пытаться расширить его на уровень класса. Поймите что метод может быть задекларирован где угодно и в любом другом методе присвоен любому классу. Что в этом случае должен выдать декоратор? Такой уж питон. Надо попробовать переформулировать задачу, возможно решение вовсе не в декораторах?
Ответ написан
JustAMan
@JustAMan
Похоже, то, что реализует ответ на поставленный вопрос — это вот этот пример:
wiki.python.org/moin/PythonDecoratorLibrary#CA-1f74040af898602b483f2d7691d29b4a5644cce2_1
Ответ написан
Комментировать
homm
@homm

> мне нужно получить объект класса в декораторе и добавить ему пару свойств. Для этого больше подойдут метаклассы. В любом случае вы не получите объект класса в момент вызова декоратора его метода — класс еще не создан.

Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы