В Python есть декораторы @property и @classmethod. Вопрос: а можно ли сделать свойство из метода класса?
Наивный подход:
class Foo(object):
@property
@classmethod
def foo(cls):
return 1
Foo.foo # <property at 0x7f74cd037bd8>
Но так это не работает, декораторы нельзя совмещать. Рабочее решение поражает своей простотой:
class classproperty(object):
def __init__(self, fget):
self.fget = fget
def __get__(self, owner, cls):
return self.fget(cls)
class Foo(object):
@classproperty
def foo(cls):
return 1
print Foo.foo
>>> 1