Alan Gauld wrote:
"Gregory, Matthew" <matt.greg...@oregonstate.edu> wrote
class PositiveX(object):
def __init__(self):
@property
def x(self):
@x.setter
def x(self, val):
I don't use properties in Python very often (hardly ever in fact) and
I've never used @setter so there may be naming requirements I'm not
aware of. But in general I'd avoid having two methods with the same name.
That's generally good advice, since one will over-write the other, but
in this specific case, the following is completely bad:
Try renaming the setter to setX() or somesuch and see if you get the
same error.
When using the x.setter and x.deleter decorators of a property, you
*must* use the same name. The example given by help(property) for
Python2.6 says this:
| Decorators make defining new properties or modifying existing ones
easy:
| class C(object):
| @property
| def x(self): return self._x
| @x.setter
| def x(self, value): self._x = value
| @x.deleter
| def x(self): del self._x
and the docs are even more explicit:
http://docs.python.org/library/functions.html#property
If you don't use the same name, chaos reigns:
>>> class Broken(object):
... def __init__(self):
... self._x = 42
... @property
... def x(self):
... return self._x
... @x.setter
... def set_x(self, value):
... self._x = value + 1
...
>>>
>>> obj = Broken()
>>> obj.x
42
>>> obj.x = 20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
--
Steven
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor