I am writting a Vector3D class as a teaching aid (not for me, for others), and I find myself pondering over the __init__ function. I want it to be as easy to use as possible (speed is a secondary consideration).
Heres the __init__ function I have at the moment. class Vector3D(object): __slots__ = ('x', 'y', 'z') def __init__(self, x_or_iter=None, y=None, z=None): if x_or_iter is None: self.x = self.y = self.z = 0 elif z is None: it = iter(x_or_iter) self.x = float(it.next()) self.y = float(it.next()) self.z = float(it.next()) else: self.x = float(x_or_iter) self.y = float(y) self.z = float(z) A Vector3D can be constructed in 3 ways. If no parameters are given it assumes a default of (0, 0, 0). If one parameter is given it is assumed to be an iterable capable of giving 3 values. If 3 values are given they are assumed to be the initial x, y, z. And now for the ponderings... 1) Is 'overloading' like this pythonic, or should I supply alternative contstructors? 2) I convert the input values to floats, which seems convenient because a Vector could be constructed with integers and other objects capable of being converted to floats. Could this hide errors? 3) I like the constructing from an iterable, but it does mean that I can do something crazy like Vector3D("123"). Could this also hide errors? 4) This does seem like a good candidate for __slots__, since there will could be large-ish lists of Vector3Ds. But is it a premature optimization? If it was just for myself or other experienced programmers I wouldn't be bothered about having the ability to do stupid things, because I simply wouldnt do them! But I dont want to teach beginner programmers bad habbits! Any comments appreciated... Will McGugan -- http://www.willmcgugan.com -- http://mail.python.org/mailman/listinfo/python-list