Edit: I rather like bobince's solution (and hope it becomes the accepted solution) since it does not involve metaclasses, and believe things that can be done just as simply without metaclasses probably should be.
class MetaFoo(type):
@property
def number(cls):
return cls.x
class Foo(object):
__metaclass__=MetaFoo
x = 4
print(Foo.number)
# 4
The usual scenario when using @property is this:
class Foo(object):
@property
def number(self):
...
foo=Foo()
foo.number
causes Python to look for number
in foo.__class__
, that is, Foo
, and if it is decorated with @property,
Python calls the function decorated by @property, with foo
as its first argument.
In complete analogy to this situation, if you want Foo.number
to call a function, you could setup
class MetaFoo(type):
@property
def number(cls):
return cls.x
class Foo(object):
__metaclass__=MetaFoo
x = 4
Just as before, Foo.number
causes Python to look for number
in Foo.__class
, that is, MetaFoo
and since it is decorated with @property,
Python calls the function so decorated with Foo
as its first argument.