Можно ли реализовать декораторы staticmethod и classmethod на чистом Python?

Это академический вопрос, а не практический. Я пытаюсь углубиться в основы Python, и мне интересно :, могу ли я реализовать декораторы staticmethodи classmethodв чистом Python, если захочу?

Для staticmethod, может быть, я мог бы сохранить ссылку на исходную функцию и вызвать ее, опуская первый аргумент?

Для classmethod, возможно, я мог бы сохранить ссылку на исходную функцию и вызывать ее, передавая тип первого аргумента, а не сам аргумент? (Как бы я справился с вызовом непосредственно в классе?)

Опять же, я не хочу реализовывать это в своих программах; Я хочу узнать, как работает язык. Если это возможно, я был бы очень признателен за образцы кода. Если не,Я был бы признателен за объяснения, почему это невозможно сделать теоретически. Спасибо!

Изменить:Спасибо за ответ и за ссылку на дескриптор протокола! В качестве средства для дальнейшего расширения моего понимания Python я хотел бы задать еще два вопроса:

  • Можно ли это сделать без протокола дескриптора, например, реализуя в наших классах специальный метод __call __?

  • Одинаково ли работает протокол дескриптора в Python 2.7 и Python 3.x?

Спасибо еще раз!

10
задан Tom 2 August 2012 в 13:35
поделиться