Это соглашение (обычно), для дескриптора при доступе к классу для возврата самого объекта дескриптора. Это то, что делает property
; если вы получаете доступ к объекту свойства в классе, вы возвращаете объект свойства (потому что это то, что он делает __get__
метод). Но это конвенция; вам не нужно так поступать.
Так что, если вам нужно только иметь геттер дескриптора на классе, и вы не возражаете, что попытка установить перепишут дескриптор, вы можете сделать что-то подобное без программирования метаклассов:
def classproperty_getter_only(f):
class NonDataDescriptor(object):
def __get__(self, instance, icls):
return f(icls)
return NonDataDescriptor()
class Foo(object):
@classproperty_getter_only
def flup(cls):
return 'hello from', cls
print Foo.flup
print Foo().flup
для
('hello from', <class '__main__.Foo'>)
('hello from', <class '__main__.Foo'>)
Если вы хотите полноценный дескриптор данных, или хотите использовать встроенный объект недвижимости, то вы правы вы можете использовать метакласс и поставить его там (реализации что этот атрибут будет полностью невидимым из случаев вашего класса; метаклассы не проверяются при поиске атрибутов на экземпляре класса).
Целесообразно? Я так не думаю. Я бы не делал то, что вы описываете случайно в производственном коде; Я бы подумал только об этом, если бы у меня была очень веская причина сделать это (и я не могу придумать такой сценарий с моей головы). Метаклассы очень мощные, но они не совсем понятны всем программистам, и их несколько сложнее рассуждать, поэтому их использование затрудняет работу с вашим кодом. Я думаю, что такого рода дизайн будет недооценивать сообщество python в целом.
Эта статья может быть полезна: http://stackoverflow.com/questions/128573 – Philipp
Действительно, это почти дубликат, за исключением того, что я явно спросил о подклассификации 'type', тогда как это просто предлагается в одном из ответов для этого вопроса. – intuited