object.attribute vs. object.getAttribute()

Jeff Epler jepler at unpythonic.net
Mon Sep 15 21:01:41 EDT 2003


On Mon, Sep 15, 2003 at 08:29:10PM -0400, Roy Smith wrote:
> For the past 6-8 months, I've spent most of my time writing C++ and a 
> little bit of Java.  Both of these languages support and encourage the 
> use of private data and explicit accessor functions, i.e. instead of 
> writing x = foo.bar, you write x = foo.getBar().  Now that I'm back to 
> writing Python, I find myself in a quandry.
> 
> Historically, I've always avoided accessor functions and just reached 
> directly into objects to get the value of their attributes.  Since 
> Python doesn't have private data, there really isn't much advantage to 
> writing accessors, but somehow I'm now finding that it just feels wrong 
> not to.  I'm not sure if this feeling is just a C++/Java-ism that will 
> cure itself with time, or if perhaps it really does make sense and I 
> should change the way I code.

Write your python code naturally, using 'x = foo.bar'.  Derive all your
classes from 'object' (use new-style classes).  If you ever need
to do something "behind the scenes", you can switch to using "property",
and have a function automatically called on attribute read, write, and
delete---and it even documents itself:

    class C(object):
        def __init__(self):
            self._y = 0

        def get_x(self):
            return self._y * self._y
            
        def set_x(self, val):
            self._y = val
            
        def del_x(self):
            raise TypeError, "Cannot delete attribute"
            
        x = property(get_x, set_x, del_x,
            "A stupid attribute that squares itself"
            "... and won't go away")
        
>>> from roy import C
>>> c = C()
>>> c.x = 3
>>> print c.x
9
>>> del c.x
>>> del c.x
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/tmp/roy.py", line 12, in del_x
    raise TypeError, "Cannot delete attribute"
TypeError: Cannot delete attribute
>>> help(C)
[...]
 |   ----------------------------------------------------------------------
 |  Properties defined here:
 |  
 |  x
 |      A stupid attribute that squares itself... and won't go away
[...]

Jeff





More information about the Python-list mailing list