On Sunday 08 May 2005 03:05 pm, [EMAIL PROTECTED] 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/
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to