Следующее не работает по некоторым причинам:
>>> class foo(object):
... @property
... @classmethod
... def bar(cls):
... return "asdf"
...
>>> foo.bar
<property object at 0x1da8d0>
>>> foo.bar + '\n'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'property' and 'str'
Существует ли способ сделать это, или моя единственная альтернатива должна обратиться к некоторому обману метакласса?
Если вы хотите свойство Descriptor
для запуска, когда вы получаете атрибут из объекта X, то необходимо поставить дескриптор в Тип (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
, по желанию.