How to write Smart Python programs?

Antoine De Groote antoine at vo.lu
Wed Oct 11 05:49:44 EDT 2006


> Googling for "python is not java" may be a good start. Also, here are 2
> common C-style smells:

Ok, the first Google result 
(http://dirtsimple.org/2004/12/python-is-not-java.html) says this somewhere:

"Getters and setters are evil. Evil, evil, I say! Python objects are not 
Java beans. Do not write getters and setters. This is what the 
'property' built-in is for. And do not take that to mean that you should 
write getters and setters, and then wrap them in 'property'. (1) That 
means that until you prove that you need anything more than a simple 
attribute access, don't write getters and setters. They are a waste of 
CPU time, but more important, they are a waste of programmer time. Not 
just for the people writing the code and tests, but for the people who 
have to read and understand them as well.

In Java, you have to use getters and setters because using public fields 
gives you no opportunity to go back and change your mind later to using 
getters and setters. (2) So in Java, you might as well get the chore out 
of the way up front. In Python, this is silly, because you can start 
with a normal attribute and change your mind at any time, without 
affecting any clients of the class. (3) So, don't write getters and 
setters."

For the record, I'm coming from Java, but I have some Python experience 
already.

Now here's what I don't understand.

What exactly is meant by (1)? The python library reference includes this 
as an example:

class C(object):
     def __init__(self): self.__x = None
     def getx(self): return self._x
     def setx(self, value): self._x = value
     def delx(self): del self._x
     x = property(getx, setx, delx, "I'm the 'x' property.")

To me this seems contradictory. Why would one not want to do something 
that is included in the documentation? Or am I just confused? Does 
anybody have an idea how to put me in the right direction?

And what does property mean anyway? The explanation in 
http://docs.python.org/lib/built-in-funcs.html is not enough for me. Can 
anybody point me to a more detailed documentation about this matter? (At 
first sight, the Python tutorial doesn't seem to describe this. At least 
it is not stated in the TOC, nor in chapter 9 which describes classes...)

And then, by (2) I believe that what is meant is that once some client 
code uses public fields one can't make them private anymore because then 
the clients are broke. That's clear to me. But I don't understand (3). I 
don't know exactly what they mean. How would one want to change their 
mind? In what way? I've been thinking about it some time now, but I'm 
still kept in the dark. I would appreciate any explanation.

I'd really like to get this, because when I use a language I want to use 
it "correctly", i.e. in the way it is intended, but right now I feel a 
bit lost :-(

I'm not done with 'How To Ask Questions The Smart Way' yet, so please 
forgive any violations. (http://catb.org/~esr/faqs/smart-questions.html)

Regards,
antoine



More information about the Python-list mailing list