On 2004-12-28 12:05:20, [EMAIL PROTECTED] wrote:
class NOTOK(object):
def __init__(self):
self.__x = 0
self.x = property(self.getx, self.setx, self.delx, "I'm the 'x'
property.")
def getx(self): return self.__x - 5
def setx(self, value): self.__x = value + 10
def delx(self): del self.__x
I seem to be missing some of the messages on this thread, but while we're talking about properties, it's probably instructive to remind people that the functions passed to the property function are not redefinable in subclasses:
py> class D(C): ... def getx(self): ... return 42 ... py> D(5).x 5 py> class C(object): ... def getx(self): ... return 1 ... x = property(getx) ... py> class D(C): ... def getx(self): ... return 42 ... py> C().x 1 py> D().x 1
Note that even though I redefined getx in class D, the 'x' property is still using the function C.getx that was passed into it.
For this reason, I usually suggest declaring properties like[1]:
py> class E(object): ... def x(): ... def get(self): ... return float(self._x) ... def set(self, x): ... self._x = x**2 ... return dict(fget=get, fset=set) ... x = property(**x()) ... def __init__(self, x): ... self._x = x ... py> e = E(42) py> e.x 42.0 py> e.x = 3 py> e.x 9.0
Note that by using the x = property(**x()) idiom, I don't pollute my class namespace with get/set/del methods that aren't really useful to instances of the class. It also makes it clear to subclasses that if they want different behavior from the x property that they'll need to redefine the entire property, not just a get/set/del method.
Steve
[1] Thanks to whoever originally suggested this! Sorry, I've forgotten who...
--
http://mail.python.org/mailman/listinfo/python-list