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 回答