Там какой-либо путь состоит в том, чтобы создать свойство класса в Python?

Следующее не работает по некоторым причинам:

>>> 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'

Существует ли способ сделать это, или моя единственная альтернатива должна обратиться к некоторому обману метакласса?

8
задан Jason Baker 31 January 2010 в 20:36
поделиться

1 ответ

Если вы хотите свойство 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 , по желанию.

6
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: