开发者

Is there any way to create a class property in Python?

开发者 https://www.devze.com 2022-12-18 11:14 出处:网络
The following doesn\'t work for some reason: >>> class foo(object): ...@property ...@classmethod

The following doesn't work for some reason:

>>> class foo(object):
...     @property
...     @classmethod
...     def bar(cls):
...             return "asdf"
... 
>>> foo.bar
<property object at 0x1da8d0>
>>> foo.bar + '\n'
Traceback (most recent call last):
  开发者_StackOverflowFile "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'property' and 'str'

Is there a way to do this, or is my only alternative to resort to some kind of metaclass trickery?


If you want the descriptor property to trigger when you get an attribute from object X, then you must put the descriptor in type(X). So if X is a class, the descriptor must go in the class's type, also known as the class's metaclass -- no "trickery" involved, it's just a matter of completely general rules.

Alternatively, you might write your own special-purpose descriptor. See here for an excellent "how-to" treaty on descriptors. Edit for example:

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

emits 23, as desired.

0

精彩评论

暂无评论...
验证码 换一张
取 消