constructor overwrite

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Mon Feb 15 16:05:04 CET 2010


Mug a écrit :
> hi ,i had a problem on constructor overwrite:
> i have something like:
> 
> class obj:
> def __init__(self, x=100, y=None):
>     if y is None:
>           self.x=x
>     else:
>           self.y=y

With such an initializer, you'll have instances with an attribute 'y' 
and no attribute 'x', and instances with an attribute 'x' and no 
attribute 'y' :

 >>> class Obj(object):
...     def __init__(self, x=100, y=None):
...         if y is None: self.x = x
...         else: self.y = y
...
 >>> objx = Obj()
 >>> objx.x
100
 >>> objx.y
Traceback (most recent call last):
   File "<console>", line 1, in <module>
AttributeError: 'Obj' object has no attribute 'y'
 >>> objy = Obj(y='foo')
 >>> objy.x
Traceback (most recent call last):
   File "<console>", line 1, in <module>
AttributeError: 'Obj' object has no attribute 'x'
 >>> objy.y
'foo'
 >>>


Are you *sure* this is what you want ?

> so i can call :
> objet = obj()  # x=100 y=None
> or
> objet = obj(40) # x= 40 y=None
> 
> but if i do :
> objet = obj('not cool') #x='not cool' y=None

What else would you expect ???

> since x is not typed .

'x' is a name, and names are indeed "untyped". Now the object bound to 
name 'x' is actually typed.

> i am waiting for a result:
> objet = obj('not cool') #x=100 y='not cool'
> as they do in C++ or java.

Python is neither C++ nor Java (nor Pascal nor Lisp nor 
<yourfavoritelanguagehere> FWIW), so trying to forcefit C++/Java idioms 
will at best lead you to pain and frustation. Just like trying to 
forcefit Python idioms in C++ or Java (or Pascal or Lisp etc....).

> is there a way to do it?

objet = obj(y='not cool')

Now if you could explain the problem you're trying to solve instead of 
the solution you thought would solve it, we might eventually provide 
more help.



More information about the Python-list mailing list