2015-05-12 2 views
0

У меня есть два конструктора в одном классе, но когда я вызываю один из них (один с одним аргументом - только сам, а не один с 4 аргументами), это приводит к ошибке , заявив, что он ожидает больше аргументов, чем 1.Метод перегрузки __init __() приводит к ошибке

класс следующим образом:

class Message: 
def __init__(self): 
    self.data = None 

def __init__(self, type, length, data): 
    self.type = type 
    self.length = length 
    self.data = data 

и призыв к ней (где я получаю сообщение об ошибке находится):

msg = Message() 

Где может быть проблема? Разве это не сравнимо с C++? Если нет, как я могу получить тот же результат по-другому?

+4

Python не допускает такого поведения - второй '__init__' ** полностью заменяет ** первый. * «Разве это не сравнимо с C++?» * - только в той мере, в какой вы можете сказать, что это не похоже на C++! – jonrsharpe

+0

Технически, '__init__' не является конструктором, а инициализатором. Он получает уже построенный объект в качестве аргумента. '__new__' является конструктором. – chepner

ответ

1

Вы не можете использовать два метода __init__ в одном классе.

Что делает ваш код эффективно, переопределяет первый метод, поэтому он никогда не используется, тогда вы получаете сообщение об ошибке, потому что вы не предоставили достаточно аргументов.

Одним из способов обойти это было бы предоставление значений по умолчанию с использованием ключевых слов. Таким образом, если вы создаете объект Message без значений, он будет использовать значения по умолчанию. В приведенном ниже примере используется None в качестве значения по умолчанию, но это может быть что-то более сложное:

class Message(object): 

    def __init__(self, type=None, length=None, data=None): 
     self.type = type 
     self.length = length 
     self.data = data 
+0

Ну, спасибо :) – Meno

0

Python не работает таким образом. Используйте это:

class Message: 
    def __init__(self, type=None, length=None, data=None): 
     self.type = type 
     self.length = length 
     self.data = data 
Смежные вопросы