John M. Gabriele wrote:
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

Reply via email to