class __properties__(type): def __new__(cls, classname, bases, classDict): names = set() propertyDict = { 'doc': {}, 'get': {}, 'set': {}, 'del': {} } newClassDict = {} importantNames = set(['del', 'doc', 'get', 'set']) for name, item in classDict.items(): if name[:3] in importantNames: function = name[:3] propertyName = name[3:] names.add(propertyName) propertyDict[function][propertyName] = item else: newClassDict[name] = item for name in names: fget = propertyDict['get'].get(name) fset = propertyDict['set'].get(name) fdel = propertyDict['del'].get(name) doc = propertyDict['doc'].get(name) newClassDict[name] = property(fget=fget, fset=fset, fdel=fdel, doc=doc) return type(classname, bases, newClassDict) if __name__ == '__main__': class Test(object): __metaclass__ = __properties__ def __init__(self): WithProperties.__init__(self) self.__test = 3 self.__readonly = 2 def gettest(self): print 'Getting test' return self.__test def settest(self, value): print 'Setting test' self.__test = value def deltest(self): print 'Attempting to delete test' doctest = "Docstring for test property" docreadonly = "a read only property" def getreadonly(self): print 'Getting readonly' return self.__readonly """ Toy implementation. Caveats: * You can't have attributes named 'doc', 'get', 'set' or 'del' * Python 2.4 only as it uses ``set`` """