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