descriptor & docstring
Gabriel Genellina
gagsl-py2 at yahoo.com.ar
Tue Apr 29 02:43:05 EDT 2008
En Tue, 29 Apr 2008 01:29:40 -0300, George Sakkis
<george.sakkis at gmail.com> 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
More information about the Python-list
mailing list