# # def prop(func): '''A decorator function for easy property creation. >>> class CLS(object): ... def __init__(self): ... self._name='Runsun Pan' ... self._mod='panprop' ... self.CLS_crazy = 'Customized internal name' ... ... @prop ... def name(): pass # Simply pass ... ... @prop ... def mod(): # Read-only, customized get ... return {'fset':None, ... 'fget': lambda self: "{%s}"%self._mod } ... ... @prop ... def crazy(): # Doc string and customized prefix ... return {'prefix': 'CLS_', ... 'doc':'I can be customized!'} >>> cls = CLS() ---------------------------- default >>> cls.name 'Runsun Pan' >>> cls.name = "Pan" >>> cls.name 'Pan' --------------------------- Read-only >>> cls.mod '{panprop}' Trying to set cls.mod=??? will get: AttributeError: can't set attribute --------------------------- Customized prefix for internal name >>> cls.crazy 'Customized internal name' >>> cls.CLS_crazy 'Customized internal name' --------------------------- docstring >>> CLS.name.__doc__ '' >>> CLS.mod.__doc__ '' >>> CLS.crazy.__doc__ 'I can be customized!' --------------------------- delete >>> del cls.crazy Trying to get cls.crazy will get: AttributeError: 'CLS' object has no attribute 'CLS_crazy' ''' ops = func() or {} name=ops.get('prefix','_')+func.__name__ # property name fget=ops.get('fget',lambda self:getattr(self, name)) fset=ops.get('fset',lambda self,value:setattr(self,name,value)) fdel=ops.get('fdel',lambda self:delattr(self,name)) return property ( fget, fset, fdel, ops.get('doc','') ) # #