Конкретный вопрос о том, почему связанные методы являются дескрипторами (должно быть очевидно, почему classmethod
объекты, верно?), См. пользовательский ответ .
Для общего вопроса о том, почему дескрипторы, не относящиеся к данным, должны быть разрешены: было бы более болезненно писать их. В конце концов, наиболее очевидный способ написать дескриптор, не связанный с данными, часто просто возвращать функцию. И функции должны быть дескрипторами, не относящимися к данным, иначе методы не сработают, победив все дескрипторы причин, которые были добавлены в язык.
Например, рассмотрим пример "чистого Python classmethod
" в HOWTO :
class ClassMethod(object):
"Emulate PyClassMethod_Type() in Objects/funcobject.c"
def __init__(self, f):
self.f = f
def __get__(self, obj, klass=None):
if klass is None:
klass = type(obj)
def newfunc(*args):
return self.f(klass, *args)
return newfunc
Или, проще, рассмотрим staticmethod
, который даже во встроенной реализации просто возвращает саму функцию при привязке.
Конечно, вы также можете реализовать любой из них, создав объект с помощью пользовательского метода __call__
, а иногда это стоит сделать (например, вы можете реализовать classmethod
с partial
или с чем-то, что действует как partial
, в этом случае не было бы никакой причины добавлять __get__
) - но когда функция просто работает, почему бы не использовать функцию?
Для более абстрактного вопроса о том, можете ли вы найти применение этой функции ... Ну, конечно. Среди вещей, которые вы можете сделать:
- Создание явных несвязанных методов в стиле 2.x, которые затем можно просматривать как методы, а не как функции.
- Создание «перебиваемых» методов как часть построения прототипа объектной системы. (Нормальные объекты метода просто игнорируют свои аргументы в
__get__
, за исключением проверки того, что либо второй является типом, либо вторым является None
, а первый является типом ...)
- Создайте объект, который имитирует функцию (а не просто вызываемый, как методы, партиалы и т. Д.), Включая возможность действовать как несвязанный метод, результат статического метода и т. Д.
Ничего из этого вы не захотите делать очень часто, но это также не то, что у Python нет никаких причин мешать вам делать.