Получить класс определения несвязанного объекта метода в Python 3

Скажем, я хочу создать декоратор для методов, определенных в классе. Я хочу, чтобы этот декоратор при вызове мог установить атрибут в классе, определяющем метод (чтобы зарегистрировать его в списке методов, которые служат определенной цели).

В 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, и если нет, то каково было основание для ее полного удаления.

ИЗМЕНИТЬ : я только что нашел этот вопрос . Это заставляет думать, что лучшее решение - просто избегать этого, как я. Мне все еще интересно, почему его удалили.

35
задан Community 23 May 2017 в 12:17
поделиться

1 ответ

Вы, кажется, упускаете из виду то, что в Python 3 тип «несвязанный метод» полностью исчез - метод, пока он не будет связан, является просто функцией, без странных несвязанных методов «проверки типов». используется для выполнения. Это делает язык проще!

А именно...:

>>> class X:
...   def Y(self): pass
... 
>>> type(X.Y)
<class 'function'>

и вуаля — на одну тонкую концепцию и различие, о которых нужно беспокоиться, меньше. Такие упрощения являются основным преимуществом Python 3 по сравнению с Python 2, который (за эти годы) накопил столько тонкостей, что был в опасности (если к нему продолжали добавляться функции) действительно потерять свой статус простого. язык. С Python 3 простота назад!-)

39
ответ дан 27 November 2019 в 06:29
поделиться
Другие вопросы по тегам:

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