You can't have two constructors in one class.
Constructors have to be named __init__
. And, unlike Java, Python doesn't allow overloading functions or methods by the type of their arguments. So, if you had two constructors, they would both be the same function.
There are a few ways around this.
Use @classmethod
s as alternate constructors:
class Breakfast(object):
@classmethod
def from_eggs(cls, eggs):
obj = cls()
obj.spam, obj.eggs = 5, eggs
return obj
@classmethod
def from_spam_and_eggs(cls, spam, eggs):
obj = cls()
obj.spam, obj.eggs = spam, eggs
return obj
A simple example from the standard library is datetime.datetime
, which can be constructed with now
, fromtimestamp
, or a few other alternate constructors, besides the default.
Use default-valued, keyword-only, and/or variable-argument parameters to make a single constructor that can be called different ways:
class Breakfast(object):
def __init__(self, eggs=0, spam=5):
self.spam, self.eggs = spam, eggs
int
is an example of this: You can create it from a string and a base, or from a single argument that knows how to convert itself to an integer.
Create subclasses that each have different constructors:
class Breakfast(object):
pass
class HealthyBreakfast(object):
def __init__(self, spam):
self.spam, self.eggs = spam, 0
class NormalBreakfast(object):
def __init__(self, spam, eggs):
self.spam, self.eggs = spam, eggs
In any of these cases, you can factor out commonalities into a single "base" initializer. For example:
class Breakfast(object):
def __init__(self, eggs, spam):
self.spam, self.eggs = spam, eggs
class HealthyBreakfast(object):
def __init__(self, spam):
super(HealthyBreakfast, self).__init__(0, spam)
Of course in no case is it possible to have breakfast without spam.