[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

constructor overwrite

Mug

2/15/2010 2:32:00 PM

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
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
since x is not typed .

i am waiting for a result:
objet = obj('not cool') #x=100 y='not cool'
as they do in C++ or java.
is there a way to do it?
thanks
3 Answers

Arnaud Delobelle

2/15/2010 2:42:00 PM

0

Mug <exallion.long@gmail.com> writes:

> 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
> 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
> since x is not typed .
>
> i am waiting for a result:
> objet = obj('not cool') #x=100 y='not cool'
> as they do in C++ or java.
> is there a way to do it?
> thanks

Your problem doesn't seem very well defined (e.g. do you ever call obj
with two arguments?), but as I understand it you can do this:

def __init__(self, x=100):
if isinstance(x, int):
self.x, self.y = x, None
else:
self.x, self.y = None, x

HTH

--
Arnaud

Steve Holden

2/15/2010 2:58:00 PM

0

Mug wrote:
> 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
> 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
> since x is not typed .
>
> i am waiting for a result:
> objet = obj('not cool') #x=100 y='not cool'
> as they do in C++ or java.
> is there a way to do it?
> thanks

You could check the type(s) of the argument(s) in your code, if you
want, but Python does not support signature analysis, dynamic method
dispatch or static typing. You can do

object = obj("y='not cool')

but I doubt this is what you want. Your post raises a couple of thier
points.

First, __init__ is *not* the constructor. By the time it is called
creation of the new object is already complete, and __init__() (as its
name suggests) merely initializes it. In Python 2's "new-style" classes,
and in Python 3, construction is performed by the class's __new__() method.

Secondly, it seems a little strange that you are happy to create
different instances, in some of which self.y is not initialized and in
others self.x is not initialized. You may have a good reason for doing
this, I merely point it out as a potential cause of AttributeError
exceptions.

regards
Steve

regards
Steve

--
Steve Holden +1 571 484 6266 +1 800 494 3119
PyCon is coming! Atlanta, Feb 2010 http://us....
Holden Web LLC http://www.hold...
UPCOMING EVENTS: http://holdenweb.event...

Bruno Desthuilliers

2/15/2010 3:05:00 PM

0

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.