Is my thinking Pythonic?
Bruno Desthuilliers
bruno.42.desthuilliers at websiteburo.invalid
Thu Aug 21 11:58:54 EDT 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