How to implement multiple constructors

Discussion in 'Python' started by tron.thomas@verizon.net, May 8, 2005.

  1. Guest

    I am a C++ developer with only a little experience using Python. I
    want to create a Python class where by I can construct an instance from
    that class based on one of two different object types.

    For example, if I were programming in C++, I would do the something
    like the following:

    class MyClass
    {
    public:
    MyClass(const SomeType& type);
    MyClass(const SomeOtherType& type);
    ....
    };

    In Python I cannot have two constructors that each take a single
    argument as Python does not distinguish the type of objects that are
    passed to functions.

    One thought I had was to use the isinstance method such as this:

    class MyClass:
    __init__(self, object):
    if isinstance(object, SomeType):
    #Initialize based on SomeType object
    ...

    elif isinstance(object, SomeOtherType):
    #Initialize base on SomeOtherType object
    ...

    else:
    #Raise some kind of exception
    ...

    Some research I've done on the Internet indicates that the use of the
    isinstance method can be problematic, and I'm not sure if it is the
    best approach to solving my problem.

    What is the best way for me to implement this type of functionality in
    Python?
     
    , May 8, 2005
    #1
    1. Advertising

  2. wrote:
    > I am a C++ developer with only a little experience using Python. I
    > want to create a Python class where by I can construct an instance from
    > that class based on one of two different object types.
    >
    > For example, if I were programming in C++, I would do the something
    > like the following:
    >
    > class MyClass
    > {
    > public:
    > MyClass(const SomeType& type);
    > MyClass(const SomeOtherType& type);
    > ...
    > };


    How about using a classmethod as an alternate constructor:

    py> class C(object):
    .... def __init__(self, i):
    .... self.i = i
    .... @classmethod
    .... def fromstr(cls, s):
    .... return cls(int(s))
    ....
    py> C(1).i
    1
    py> C.fromstr('2').i
    2

    STeVe
     
    Steven Bethard, May 8, 2005
    #2
    1. Advertising

  3. James Stroud Guest

    On Sunday 08 May 2005 03:05 pm, wrote:
    > I am a C++ developer with only a little experience using Python. I
    > want to create a Python class where by I can construct an instance from
    > that class based on one of two different object types.
    >
    > For example, if I were programming in C++, I would do the something
    > like the following:
    >
    > class MyClass
    > {
    > public:
    > MyClass(const SomeType& type);
    > MyClass(const SomeOtherType& type);
    > ...
    > };
    >
    > In Python I cannot have two constructors that each take a single
    > argument as Python does not distinguish the type of objects that are
    > passed to functions.
    >
    > One thought I had was to use the isinstance method such as this:
    >
    > class MyClass:
    > __init__(self, object):
    > if isinstance(object, SomeType):
    > #Initialize based on SomeType object
    > ...
    >
    > elif isinstance(object, SomeOtherType):
    > #Initialize base on SomeOtherType object
    > ...
    >
    > else:
    > #Raise some kind of exception
    > ...


    > Some research I've done on the Internet indicates that the use of the
    > isinstance method can be problematic, and I'm not sure if it is the
    > best approach to solving my problem.
    >
    > What is the best way for me to implement this type of functionality in
    > Python?


    In case you haven't found it: <http://www.canonical.org/~kragen/isinstance/>

    Can both of these classes (be modified to/subclassed to) support the same
    interface such that MyClass.__init__ will not care which is passed? I believe
    this would be the best solution (read: "my favorite solution"). If you know
    what type of object "object" is (BTW, a keyword in 2.3 and later, I believe),
    then one approach is to initialize with a blank MyClass instance and use
    "fill_with_SomeType()" and "fill_with_SomeOtherType()" methods.

    I think the least elegant approach is to test for interface compatibility,
    e.g.:

    try:
    self.avalue = isinstance.get_avalue()
    except NameError:
    self.avalue = isinstance.get_anothervalue()

    But this may get out of hand with many different possibilites.

    James

    --
    James Stroud
    UCLA-DOE Institute for Genomics and Proteomics
    Box 951570
    Los Angeles, CA 90095

    http://www.jamesstroud.com/
     
    James Stroud, May 8, 2005
    #3
  4. James Stroud Guest

    On Sunday 08 May 2005 03:28 pm, James Stroud wrote:
    >    try:
    >      self.avalue = isinstance.get_avalue()
    >    except NameError:
    >      self.avalue = isinstance.get_anothervalue()


    I have no idea where I copied those "isinstance"s from. Also, the except
    should be an AttributeError. Here is a retry:

       try:
         self.avalue = aninstance.get_avalue()
       except AttributeError:
         self.avalue = aninstance.get_anothervalue()

    --
    James Stroud
    UCLA-DOE Institute for Genomics and Proteomics
    Box 951570
    Los Angeles, CA 90095

    http://www.jamesstroud.com/
     
    James Stroud, May 8, 2005
    #4
  5. J C Lawrence Guest

    wrote:

    > I am a C++ developer with only a little experience using Python. I
    > want to create a Python class where by I can construct an instance from
    > that class based on one of two different object types.


    The approaches I've seen used are to use a new class method as an
    alternate ctor with a special name, and to use the types module for type
    comparison within such a ctor.

    --
    J C Lawrence They said, "You have a blue guitar,
    ---------(*) You do not play things as they are."
    The man replied, "Things as they are
    http://www.kanga.nu/~claw/ Are changed upon the blue guitar."
     
    J C Lawrence, May 8, 2005
    #5
  6. James Stroud wrote:
    > If you know what type of object "object" is
    > (BTW, a keyword in 2.3 and later, I believe)


    Not a keyword, but a builtin as of 2.2.

    STeVe
     
    Steven Bethard, May 9, 2005
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dave Rudolf
    Replies:
    12
    Views:
    8,331
    Martijn Lievaart
    Feb 6, 2004
  2. Jeremy Smith
    Replies:
    2
    Views:
    603
    Jeremy Smith
    Aug 3, 2006
  3. Jess
    Replies:
    5
    Views:
    615
    Ron Natalie
    Jun 7, 2007
  4. Peng Yu
    Replies:
    5
    Views:
    403
    Juha Nieminen
    Sep 19, 2008
  5. srp113
    Replies:
    3
    Views:
    482
Loading...

Share This Page