How to write Smart Python programs?

Fredrik Lundh fredrik at pythonware.com
Wed Oct 11 09:33:10 EDT 2006


Antoine De Groote wrote:

> Don't forget to derive your class from object, otherwise properties
> won't work.

getters work, setters don't (because the old-style objects checks the instance
before it looks for hooks in the class):

>>> class Spam:
...     def getx(self):
...             return "x"
...     def setx(self, value):
...             print "set to", value
...     x = property(getx, setx)
...
>>> s = Spam()
>>> s.x
'x'
>>> s.x = "y"
>>> s.x
'y'

>> As a side node, the getters/setters of a property are often either
>> marked as implementation (the _leading_underscore convention) or deleted
>> from the class's dict once the property is created or 'masked' one way
>> or another so they don't pollute the class's namespace.
>
> You mean like manually removed from the dict?

explicitly deleted:

>>> class Spam(object):
...     def getx(self):
...             return "x"
...     def setx(self, value):
...             print "set to", value
...     x = property(getx, setx)
...     del getx, setx
...
>>> s = Spam()
>>> s.x
'x'
>>> s.x = "y"
set to y
>>> s.getx()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Spam' object has no attribute 'getx'

(note that the class definition is executed in a class-specific namespace; whatever's
left in that namespace when you reach the end of the class statement is added to the
class).

</F> 






More information about the Python-list mailing list