Код: Выделить всё
class Identity:
def __init__(self, value):
self.value = value
def __get__(self, obj, objtype=None):
return self.value
def __set__(self, obj, value):
self.value = value
class Example:
@Identity
def non_method():
pass
Код: Выделить всё
>>> example = Example()
>>> example.non_method
Мне кажется, что return self.value в Identity.__get__ должен инициировать поведение дескриптора исходной функции non_method, хранящейся в self.value, и возвращать метод, связанный с объектом Identity, поэтому return self.value должен запускаться (приблизительно) return getattr_static(self, "value").__get__(self, type(self)).
Сначала я думал, что, возможно, объект функции проверяет, привязан ли он к классу, который изначально его определил, но это не так:
Код: Выделить всё
>>> import inspect
>>> example.non_method.__get__(inspect.getattr_static(example, "non_method"), Identity)
Что здесь происходит? Почему дескриптор функции не срабатывает?