В рамках объектно-ориентированного программирования конструктор класса – это специальный метод, который
автоматически запускается при создании экземпляров. Его также называют конструктором объектов. Название
такого метода обычно определяется синтаксисом используемого языка программирования. Например, в Java имя
конструктора совпадает с именем класса. В языке Python конструктором является метод __init__()
.
В Python наличие пары символов подчеркивания в начале и в конце имени метода указывает на его принадлежность к методам перегрузки операторов. Определение таких методов в классе позволяет объектам участвовать в арифметических операциях, быть вызванными как функции и в других случаях.
Для методов перегрузки операторов не требуется явный вызов по имени. Имплицитный вызов происходит через
участие объекта в определенной операции. Что касается конструктора класса, его вызывают в момент создания
объекта, и это событие активирует метод __init__()
при его наличии в классе.
Конструктор необходим для того, чтобы объекты могли сразу обладать определенными свойствами. В качестве примера можно рассмотреть класс Person, объекты которого обязательно должны иметь имя и фамилию. Если класс реализован подобным образом:
class Person: def setName(self, n, s): self.name = n self.surname = s
то объекты можно создавать без указания полей, а метод setName()
придется
вызывать отдельно для установки имени и фамилии:
>>> from test import Person >>> p1 = Person() >>> p1.setName("Bill", "Ross") >>> p1.name, p1.surname ('Bill', 'Ross')
Конструктор класса, в отличие от метода setName, не позволит создать объект без необходимых полей:
class Person: def __init__(self, n, s): self.name = n self.surname = s p1 = Person("Sam", "Baker") print(p1.name, p1.surname)
Здесь при создании экземпляра класса в круглых скобках указываются значения, которые передаются параметрам метода __init__(). Первый параметр self представляет ссылку на только что созданный объект.
Попытка создания объекта без передачи аргументов в конструктор вызовет исключение, объект не будет создан:
>>> p1 = Person() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: __init__() missing 2 required positional arguments: 'n' and 's'
Однако может возникнуть необходимость создавать объект без передачи данных в конструктор. Для этого параметрам конструктора присваиваются значения по умолчанию:
class Rectangle: def __init__(self, w=0.5, h=1): self.width = w self.height = h def square(self): return self.width * self.height rec1 = Rectangle(5, 2) rec2 = Rectangle() rec3 = Rectangle(3) rec4 = Rectangle(h = 4) print(rec1.square()) print(rec2.square()) print(rec3.square()) print(rec4.square())
Результаты исполнения:
10 0.5 3 2.0
Если вызов класса осуществляется без передачи значений, то для параметров будут установлены их значения по умолчанию. При этом поля width и height будут у всех объектов заданы.
При этом конструктор вовсе не обязательно должен принимать параметры, кроме self. Значения атрибутов могут устанавливаться внутри конструктора. Не обязательно напрямую присваивать значения атрибутам объекта. Здесь тоже допустим код, создающий объекты других классов.
Практическая работа. Конструктор и деструктор
Помимо конструктора объектов в программировании предусмотрен метод, обратный ему, – деструктор. Этот метод активируется, когда объект удаляется.
В Python объект уничтожается, если все ссылки на него исчезли или если переменной присвоено другое значение, теряется связь со старым объектом. Удаление переменной выполняется через команду del.
В Python метод __del__()
выполняет функцию деструктора.
Напишите программу согласно следующему описанию:
- Создайте класс Person, у которого конструктор принимает три параметра (за исключением self) – имя, фамилию и квалификацию специалиста. Для квалификации задается значение по умолчанию, равное единице.
- Реализуйте метод для класса Person, который возвращает строку с информацией о сотруднике.
- В класс Person добавьте деструктор, выводящий сообщение "До свидания, мистер …" (подставляя имя и фамилию объекта вместо троеточия) перед его удалением.
- В главной части программы создайте три объекта класса Person, ознакомьтесь с информацией о них и "увольте" самого неопытного.
- В завершение программы вставьте вызов функции input(), чтобы скрипт оставался активным до нажатия Enter. В противном случае, при завершении вы увидите как удаляются все объекты.
В Python метод деструктора применяют редко, так как интерпретатор автоматически справляется с очисткой ненужных объектов.