def build_properties(cls, new_attrs):
 for (name, value) in new_attrs.items():
  if (name.endswith('__get') or name.endswith('__set') or name.endswith('__del')):
   base = name[:(-5)]
   if hasattr(cls, base):
    old_prop = getattr(cls, base)
    if (not isinstance(old_prop, property)):
     raise ValueError(('Attribute %s is a %s, not a property; function %s is named like a property' % (base, type(old_prop), name)))
    attrs = {'fget': old_prop.fget, 'fset': old_prop.fset, 'fdel': old_prop.fdel, 'doc': old_prop.__doc__}
   else:
    attrs = {}
   attrs[('f' + name[(-3):])] = value
   if (name.endswith('__get') and value.__doc__):
    attrs['doc'] = value.__doc__
   new_prop = property(**attrs)
   setattr(cls, base, new_prop)

def build_properties ( cls , new_attrs ) : for ( name , value ) in new_attrs . items ( ) : if ( name . endswith ( '__get' ) or name . endswith ( '__set' ) or name . endswith ( '__del' ) ) : base = name [ : ( - 5 ) ] if hasattr ( cls , base ) : old_prop = getattr ( cls , base ) if ( not isinstance ( old_prop , property ) ) : raise ValueError ( ( 'Attribute %s is a %s, not a property; function %s is named like a property' % ( base , type ( old_prop ) , name ) ) ) attrs = { 'fget' : old_prop . fget , 'fset' : old_prop . fset , 'fdel' : old_prop . fdel , 'doc' : old_prop . __doc__ } else : attrs = { } attrs [ ( 'f' + name [ ( - 3 ) : ] ) ] = value if ( name . endswith ( '__get' ) and value . __doc__ ) : attrs [ 'doc' ] = value . __doc__ new_prop = property ( ** attrs ) setattr ( cls , base , new_prop )
given a class and a new set of attributes .