En Tue, 29 Apr 2008 01:29:40 -0300, George Sakkis <[EMAIL PROTECTED]> escribió:
On Apr 28, 10:59 pm, "Gabriel Genellina"

def property_default(prop_name, default_value=None, doc=None):

     attr_name = '_'+prop_name

     def fget(self, attr_name=attr_name,
                    default_value=default_value):
         return getattr(self, attr_name, default_value)

     def fset(self, value,
                    attr_name=attr_name,
                    default_value=default_value):
         if value == default_value:
             delattr(self, attr_name)
         else:
             setattr(self, attr_name, value)

     return property(fget=fget, fset=fset, doc=doc)

When setting the same value as the default, the instance attribute is  
removed (so the default will be used when retrieving the value later). I think this is what you intended to do.

Note that this will fail if the value is already equal to the default
and you try to reset it to the default, so it needs an extra
hasattr(self, attr_name) before the delattr. Regardless, I would be
surprised with the following behaviour:

r = Rectangle()
r.length = 4
type(r.length)
<type 'int'>
r.length = 12
type(r.length)
<type 'float'>

Yep, probably the best thing to do is to always call setattr and avoid special cases.

Another simpler alternative would be to (ab)use a decorator:

def defaultproperty(func):
    attr = '_' + func.__name__
    default = func.func_defaults[0]
    return property(
        fget = lambda self: getattr(self, attr, default),
        fset = lambda self,value: setattr(self, attr, value),
        doc = func.__doc__)


class Rectangle(object):
    '''A beautiful Rectangle'''

    @defaultproperty
    def length(default=12.0):
        '''This is the length property'''


Nice, although that empty function looks somewhat strange...

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to