Скажем, я хочу сделать декоратор для методов, определенных в классе. Я хочу, чтобы этот декоратор при вызове мог установить атрибут класса, определяющего метод (чтобы зарегистрировать его в списке методов, которые служат для определенной цели).
В Python 2 метод im_class
отлично выполняет это:
def decorator(method):
cls = method.im_class
cls.foo = 'bar'
return method
Однако в Python 3 такой атрибут (или его замена) не существует. Полагаю, идея заключалась в том, что вы можете вызвать type(method.__self__)
, чтобы получить класс, но это не работает для несвязанных методов, так как __self__ == None
в этом случае.
ПРИМЕЧАНИЕ.. Этот вопрос на самом деле немного неактуальен для моего случая, так как я выбрал вместо этого атрибут самого метода, а затем проверил экземпляр всех его методов, ищущих этот атрибут в соответствующее время. Я также (в настоящее время) использую Python 2.6. Тем не менее, мне любопытно, есть ли какая-либо замена для функциональности версии 2, а если нет, то зачем было ее полностью удалять.
EDIT: я только что нашел этот вопрос. Это заставляет думать, что лучшим решением является просто избежать этого, как у меня. Я все еще удивляюсь, почему это было удалено, хотя.