Почему не работает метод объекта, если объект создать без конструктора

206 просмотра
0
0 Комментариев

Код на Python

class Element:
 
    def __init__(self):
        pass
 
    def __init__(self,name,symbol,number):
        self.name = name
        self.symbol = symbol
        self.number = number
 
    def dump(self):
        print(self.name)
        print(self.symbol)
        print(self.number)
 
element = Element()
element.name = 'Hydro3gen'1
element.symbol = 'H'
element.number = 1
 
element.dump()

Я только учусь…

  1. Нужен ли конструктор по без аргументов в классе?
  2. Почему если я не пользуюсь конструктором, а вручную ставлю значения полям объекта, то dump не вызвать, а если создать объект с конструктором, куда я подставлю все те же значения, то тогда dump работает.

Добавить комментарий

1 Ответы

Python Опубликовано 10.12.2018
0

В Python нет полиморфизма (такого как в С++, например), поэтому в классе не может быть двух методов с одним именем. По факту второй метод __init__ просто перезапишет первый, и при попытке создания объекта без параметров интерпретатор выдаст ошибку:

TypeError: __init__() missing 3 required positional arguments: 'name', 'symbol', and 'number'

Если нужна возможность создания объекта без параметров, можно задать значения параметров по-умолчанию:

class Element:
    def __init__(self, name=None, symbol=None, number=None):
        self.name = name
        self.symbol = symbol
        self.number = number

Тогда вызов Element() не приведет к ошибке, и поля будут инициализированы значением None.

Надеюсь, по первому пункту теперь все понятно.

По второму пункту: можно использовать пример класса выше (не забыв добавить метод dump), и все будет работать. А можно вообще создать класс без __init__, но с методом dump, инициализировать класс «снаружи», а потом вызвать dump, и это сработает:

class Element:
    def dump(self):
        print(self.name)
        print(self.symbol)
        print(self.number)
 
element = Element()
element.name = 'Hydro3gen'
element.symbol = 'H'
element.number = 1
 
element.dump()

Вывод:

Hydro3gen
H
1

Как видите, никаких ограничений на инициализацию объекта «снаружи» нет.

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up