Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > constructor overwrite

Reply
Thread Tools

constructor overwrite

 
 
Mug
Guest
Posts: n/a
 
      02-15-2010
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
 
Reply With Quote
 
 
 
 
Arnaud Delobelle
Guest
Posts: n/a
 
      02-15-2010
Mug <(E-Mail Removed)> 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
 
Reply With Quote
 
 
 
 
Steve Holden
Guest
Posts: n/a
 
      02-15-2010
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.pycon.org/
Holden Web LLC http://www.holdenweb.com/
UPCOMING EVENTS: http://holdenweb.eventbrite.com/

 
Reply With Quote
 
Bruno Desthuilliers
Guest
Posts: n/a
 
      02-15-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.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
A constructor calling another constructor (default constructor)? Generic Usenet Account C++ 10 11-28-2007 04:12 AM
stringstream overwrite with constructor vs. << martinezfive@comcast.net C++ 9 01-05-2007 07:07 PM
Overwrite Default Constructor ? Philipp Leitner Java 26 04-19-2006 07:50 AM
calling a constructor within a constructor Brett Irving C++ 3 06-29-2003 10:43 AM
why it's not possible calling constructor from constructor? Giulio C++ 9 06-25-2003 03:56 PM



Advertisments