About classes and OOP in Python

bruno at modulix onurb at xiludom.gro
Tue Apr 11 05:12:09 EDT 2006


fyhuang wrote:
> Hello all,
> 
> I've been wondering a lot about why Python handles classes and OOP the
> way it does. From what I understand, there is no concept of class
> encapsulation in Python, i.e. no such thing as a private variable.

Seems you're confusing encapsulation with data hiding.

> Any
> part of the code is allowed access to any variable in any class,

This is also true for Java and C++ - it just a requires a little bit
more language-specific knowledge.

Python relies a lot on conventions. One of these conventions is that any
attribute whose name begins with an underscore is implementation detail
and *should* not be accessed from client code.

> and
> even non-existant variables can be accessed:

Nope. You can dynamically *add* new attributes - either to an instance
or a class - but trying to *read* a non-existant attribute will raise an
AttributeError.

> they are simply created.
> I'm wondering what the philosophy behind this is,

Dynamism.

> and if this
> behaviour is going to change in any future release of Python.

Certainly not.

> It seems to me that it is difficult to use OOP to a wide extent in
> Python code because these features of the language introduce many
> inadvertant bugs.

Don't assume, verify. My own experience is that it's *much more* easy to
do OOP with a dynamic language.

> For example, if the programmer typos a variable name
> in an assignment, the assignment will probably not do what the
> programmer intended.

That's true for any language. I never had any serious problem with this
in 5+ years - not that I'm never making typos, but it never took me more
than a pair of minutes to spot and correct this kind of errors. OTOH,
Python's dynamism let me solved in a quick and clean way problems that
would have been a royal PITA in some less agile languages.

> Ruby does something with this that I think would be excellent as an
> inclusion in Python (with some syntax changes, of course). If private
> variables require a setter/getter pair, we can shortcut that in some
> way, i.e. (pseudocode):
> 
> class PythonClass:
>    private foo = "bar"
>    private var = 42
>    allow_readwrite( [ foo, var ] )

A first point: in Ruby (which closely follows Smalltalk's model),
there's a definitive distinction between callable and non-callable
attributes, and this last category is *always* private.

A second point is that Python also provides you getter/setter for
attributes. The default is read/write, but you can easily make any
attribute read-only (or write-only FWIW) and add any computation.

> Or allow_read to only allow read-only access. Also there might be a
> way to implement custom getters and setters for those times you want
> to modify input or something:
> 
> class PythonClass:
>    def get foo():
>        return "bar"
> 
>    def set var( value ):
>        var = value

What you want is named "property".

> Anyways, these are just some speculatory suggestions.

Don't waste time with speculations. Read the Fine Manual instead, and
actually *use* Python.

> My main question
> is that of why Python chooses to use this type of OOP model and if it
> is planned to change.

I'm not the BDFL, but my bet is that this will *not* change.

-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list