Если вы хотите, чтобы дескриптор property
срабатывал при получении атрибута от объекта X, тогда вы должны поместить дескриптор в type(X)
. Поэтому, если X является классом, дескриптор должен идти в типе класса, также известном как метакласс класса - никаких «хитростей» в этом нет, это просто вопрос совершенно общих правил.
В качестве альтернативы, вы можете написать свой собственный специализированный дескриптор. См. здесь для превосходного соглашения о дескрипторах с практическими рекомендациями. Редактировать например:
class classprop(object):
def __init__(self, f):
self.f = classmethod(f)
def __get__(self, *a):
return self.f.__get__(*a)()
class buh(object):
@classprop
def bah(cls): return 23
print buh.bah
испускает 23
, по желанию.