Скажем, я хочу создать декоратор для методов, определенных в классе. Я хочу, чтобы этот декоратор при вызове мог установить атрибут в классе, определяющем метод (чтобы зарегистрировать его в списке методов, которые служат определенной цели).
В Python 2 Метод im_class
прекрасно справляется с этой задачей:
def decorator(method):
cls = method.im_class
cls.foo = 'bar'
return method
Однако в Python 3, похоже, не существует такого атрибута (или его замены). Я полагаю, идея заключалась в том, чтобы вы могли вызвать тип (метод .__ self__)
, чтобы получить класс, но это не работает для несвязанных методов, поскольку __ self__ == None
в этом случае.
ПРИМЕЧАНИЕ: Этот вопрос на самом деле немного неактуален для моего случая , поскольку вместо этого я решил установить атрибут в самом методе, а затем заставить экземпляр сканировать все его методы в поисках этого атрибута в подходящем последнее время. Я также (в настоящее время) использую Python 2.6. Однако мне любопытно, есть ли какая-либо замена функциональности версии 2, и если нет, то каково было основание для ее полного удаления.
ИЗМЕНИТЬ : я только что нашел этот вопрос . Это заставляет думать, что лучшее решение - просто избегать этого, как я. Мне все еще интересно, почему его удалили.
Вы, кажется, упускаете из виду то, что в Python 3 тип «несвязанный метод» полностью исчез - метод, пока он не будет связан, является просто функцией, без странных несвязанных методов «проверки типов». используется для выполнения. Это делает язык проще!
А именно...:
>>> class X:
... def Y(self): pass
...
>>> type(X.Y)
<class 'function'>
и вуаля — на одну тонкую концепцию и различие, о которых нужно беспокоиться, меньше. Такие упрощения являются основным преимуществом Python 3 по сравнению с Python 2, который (за эти годы) накопил столько тонкостей, что был в опасности (если к нему продолжали добавляться функции) действительно потерять свой статус простого. язык. С Python 3 простота назад!-)