Is my thinking Pythonic?

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Aug 21 17:58:54 CEST 2008


Hussein B a écrit :
> Hey,
> Well, as you all know by now, I'm learning Python :)
> One thing that is annoying my is the OOP in Python.

If so, the answer to your question is "obviously, no" !-)

Ok, let's see...

> Consider this code in Java:
> --
> public class Car {
>   private int speed;
>   private String brand;
>   // setters & getters
> }
> --
> With one look at the top of the class, you  can know that each
> instance has two instance variables (speed & brand).
> I tried to transform in into Python:
> --
> class Car:

Unless you have a compelling reason, use new-style classes:

class Car(object)

>   def setspeed(self, speed):
>      self.speed = speed
>   def setbrand(self, brand):
>      self.brand = brand

Java, C++ etc require getters and setters because they have no support 
for computed attributes, so you cannot turn a plain attribute into a 
computed one without breaking code. Python has good support for computed 
attributes, so you just don't need these getters and setters. The 
pythonic translation would be:

class Car(object):
     def __init__(self, speed, brand):
         self.speed = speed
         self.brand = brand

> If you have a huge class, you can't figure the instance variables of
> each object.

If your class is that huge, then it's probably time to either refactor 
and/or rethink your design.

> So, I created this constructor:

<mode="pedantic">
s/constructor/initialiser/
</mode>


> --
> def __init__(self):
>   self.speed = None
>   self.brand = None

If I may ask : why don't you pass speed and brand as parameters ? If you 
want to allow a call without params, you can always use default values, ie:

class Car(object):
     def __init__(self, speed=None, brand=None):
         self.speed = speed
         self.brand = brand


> This way, I can figure the instance variables by just reading the
> __init__ method.
> What do you think of my approach? is it considered Pythonic?

As far as I'm concerned - and modulo the question about initiliser's 
params - I consider good style to set all instance attributes to 
sensible default values in the initializer whenever possible, so, as you 
say, you don't have to browse the whole code to know what's available.

Now remember that Python objects (well, most of them at least) are 
dynamic, so attributes can be added outside the class statement body.



More information about the Python-list mailing list