8

以下は、何らかの理由で機能しません。

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

これを行う方法はありますか、それともある種のメタクラスのトリックに頼る唯一の選択肢ですか?

4

1 に答える 1

6

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します。

于 2010-01-31T21:05:28.283 に答える