Property Classes May 14, 2011
Tired of creating properties the old way? Python 3 brings an improvement in the form of multi-stage properties, i.e.,
@property
def foo(self):
... # getter
@foo.setter
def foo(self, value):
... # setter
It still feels very awkward. I can’t say my solution is pure elegance, but I find it cleaner.
Code
import types
def property_class(cls):
getter = getattr(cls, "get", None)
if isinstance(getter, types.UnboundMethodType):
getter = getter.im_func
setter = getattr(cls, "set", None)
if isinstance(setter, types.UnboundMethodType):
setter = setter.im_func
return property(getter, setter)
Example
>>> class Person(object):
... def __init__(self):
... self._age = 17
... @property_class
... class age:
... def get(self):
... return self._age
... def set(self, value):
... self._age = value
...
>>> p = Person()
>>> p.age
17
>>> p.age=19
>>> p.age
19