@Guido
One would have to introduce some kind of convention where you can write properties with a leading _
One doesn't even need the @property decorator in this case. For example: def __getattr__(name): g = globals() name = '_' + name if name in g: return g[name]() raise AttributeError(...) def _attr(): "do something" return actual_object One can even write a decorator that would change the name automatically (but this will require a call at the end of module to unbind original names). The space for play is infinite. The question is what exactly is needed. I would say that already basic customisation (like __getattr__) will be enough. IIUC, this will be actually a bit faster than setting __class__ since only "customized" attributes will be affected. -- Ivan