У вас нет двух конструкторов в одном классе.
Конструкторы должны быть названы __init__
. И, в отличие от Java, Python не позволяет перегружать функции или методы по типу своих аргументов. Итак, если бы у вас было два конструктора, они оба были бы одной и той же функцией.
Существует несколько способов обойти это.
Используйте @classmethod
с, как альтернативные Конструкторы:
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
Простой пример из стандартной библиотеки datetime.datetime
, который может быть построен с now
, fromtimestamp
или несколько других альтернативных Конструкторы, кроме default ,
Использовать по умолчанию многозначного, только с ключевыми словами, и/или параметры переменного аргумента, чтобы сделать один конструктор, который можно назвать по-разному:
class Breakfast(object):
def __init__(self, eggs=0, spam=5):
self.spam, self.eggs = spam, eggs
int
является примером: Вы может создать его из строки и базы, или из одного аргумента, который знает, как преобразовать себя в целое число.
Создание подклассов, каждая из которых различные конструкторы:
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
В любом из этих случаев вы можете вынесем общностей в один «базовый» инициализаторе. Например:
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)
Конечно ни в коем случае можно завтракать без спама.
вы могли бы иметь конструктор подкласса называют суперкласс конструктор через 'супер' http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods –
Спасибо за ответ. Дело в том, что, позвонив супер, у меня будет только один конструктор. В Java возможно иметь более одного, если число (и/или тип) аргументов различно. Интересно, существует ли то же самое в python. –
Вы можете использовать '@ classmethod', чтобы сделать столько конструктор-подобных методов, сколько хотите. – roippi