On 30 December 2011 20:40, Adam Funk <a24...@ducksburg.com> wrote: > (Warning: this question obviously reflects the fact that I am more > accustomed to using Java than Python.) > > Suppose I'm creating a class that represents a bearing or azimuth, > created either from a string of traditional bearing notation > ("N24d30mE") or from a number indicating the angle in degrees as > usually measured in trigonometry (65.5, measured counter-clockwise > from the x-axis). The class will have methods to return the same > bearing in various formats. > > In Java, I would write two constructors, one taking a single String > argument and one taking a single Double argument. But in Python, a > class can have only one __init__ method, although it can have a lot of > optional arguments with default values. What's the correct way to > deal with a situation like the one I've outlined above?
(Using Python 3 below) Method 1 ---------- Your __init__ method could take the angle as an argument (which seems the most natural to me). Then you could have a class method that takes the string i.e. class Bearing: def __init__(self, angle): self.angle = angle # or whatever your internal reprsentation is @classmethod def fromstring(cls, string): # Here, work out the angle from the string return cls(angle) So you can do: b = Bearing(65.5) or b = Bearing.fromstring("N24d30mE") Method 2 ---------- You can test the type of the argument of the __init__ method class Bearing: def __init__(self, arg): if isinstance(arg, str): # here calculate the value of angle else: angle = float(angle) self.angle = angle Now you can do: b = Bearing(65.5) or b = Bearing("N24d30mE") Both methods are used for builtin types: >>> int('12') 12 >>> int(12.5) 12 >>> dict([(1, 2), (3, 4)]) {1: 2, 3: 4} >>> dict.fromkeys([1, 2]) {1: None, 2: None} HTH -- Arnaud -- http://mail.python.org/mailman/listinfo/python-list