Ответ 1
Если вы хотите, чтобы дескриптор 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
по желанию.