constructor overwrite

M

Mug

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
 
A

Arnaud Delobelle

Mug said:
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
 
S

Steve Holden

Mug said:
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
 
B

Bruno Desthuilliers

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' :
.... def __init__(self, x=100, y=None):
.... if y is None: self.x = x
.... else: self.y = y
....Traceback (most recent call last):
Traceback (most recent call last):


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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top