class Vector3d:
def __init__(self):
...
def __init__(self, x_from, y_from, z_from, x_to, y_to, z_to):
...
def __init__(self, point_from, point_to):
...
def __init__(self, same_as_this_vec):
...
My preferred option is to break these into different methods. I pick the xyz-coords (and the empty coords) __init__ as the most basic cases, but if you find one of the other cases to be more basic, the modification should be pretty simple.
class Vector3d(object):
# define init to take only xyz coords (missing coords default to 0)
# this covers your first two cases, I think
def __init__(self, x_from=0.0, y_from=0.0, z_from=0.0,
x_to=0.0, y_to=0.0, z_to=0.0):
... # define a classmethod that creates a Vector3d from points
# this covers your third case
@classmethod
def from_points(cls, point_from, point_to):
...
return cls(x_from=..., y_from=..., ...) # define copy as an instance method, not a constructor
# this covers your fourth case
def copy(self):
...
return type(self)(x_from=..., y_from=..., ...)
Another possibility is to play around with *args:
class Vector3d(object):
def __init__(self, *args):
if not args:
# constructor with no arguments
elif len(args) == 6:
# constructor with xyz coords
elif len(args) == 2:
# constructor with points
elif len(args) == 1:
# copy constructor
else:
raise TypeError('expected 0, 1, 2 or 6 args, got %i' %
len(args))But this can get really ugly really quick.
HTH,
STeVe -- http://mail.python.org/mailman/listinfo/python-list
