Constructor overloading

Shalabh Chaturvedi shalabh at cafepy.com
Thu Jun 10 05:36:42 CEST 2004


Sergey Krushinsky wrote:

> Hello all,
> 
> Is there a common way to emulate constructor overloading in Python class?
> 
> For instanse, I have 3 classes:
> 1/ Polar - to hold polar coordinates;
> 2/ Cartesian - to hold cartesian coordinates;
> 3/ Coordinates3D, which holds synchronized instances of the both in 
> __p__ and __c__ fields respectively.
> 
> I want to design Coordinates3D so that when instantiated with Polar 
> argument, self.__p__=argument passed to constructor, and self.__c__ is 
> calculated. When argument is Cartesian, self.__c__=argument, and 
> self.__p__ is calculated. Runtime type checking works, but maybe there 
> is a better way?
> 
> Thanks in advance,
> Sergey

My usual approach to such cases is using keyword arguments:

#untested code

class Coordinates3d:
     def __init__(self, polar_coords=None, cartesian_coords=None):
         if polar_coords:
             ....
         elif cartesian_coords:
             ....
         else:
             raise Exception, 'at least one required'

Then it can be instantiated as Coordinates3d(polar_coords=polar) or 
Coordinates3d(cartesian_coords=cartes). You can also add a check if 
polar_coords and cartesian_coords then raise an exception 'only one 
should be specified'.

Another option is to define two staticmethods on the class which can be 
used thus:

a = Coordinates3d.from_polar(polar)
b = Coordinates3d.from_cartes(cartes)

Both options are explicit, which I think is a Good Thing. Depends on 
your taste.

--
Shalabh





More information about the Python-list mailing list