__init__() - метод создания класса

В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. В Python же роль конструктора играет метод __init__().

В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.

При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__(), если он определен в классе.

Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person, объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом:

class Person:
    def setName(self, n, s):
        self.name = n
        self.surname = s
1
2
3
4

то создание объекта возможно без полей. Для установки имени и фамилии метод setName() нужно вызывать отдельно:

p1 = Person()
p1.setName("Bill", "Ross")
print(p1.name, p1.surname)      # Bill Ross
1
2
3

В свою очередь, конструктор класса не позволит создать объект без обязательных полей:

class Person:
    def __init__(self, n, s):
        self.name = n
        self.surname = s

p1 = Person("Sam", "Baker")
print(p1.name, p1.surname)      # Sam Baker
1
2
3
4
5
6
7

Здесь при вызове класса в круглых скобках передаются значения, которые будут присвоены параметрам метода __init__(). Первый его параметр – self – ссылка на сам только что созданный объект.

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

p1 = Person()
1

В консоль выводиться ошибка: «отсутствует 2 обязательных позиционных аргумента: "n" и "s":

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'n' and 's'
1
2
3

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

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())        # 10
print(rec2.square())        # 0.5
print(rec3.square())        # 3
print(rec4.square())        # 2.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Если класс вызывается без значений в скобках, то для параметров будут использованы их значения по умолчанию. Однако поля width и height будут у всех объектов.

Кроме того, конструктору вовсе не обязательно принимать какие-либо параметры, не считая self. Значения полям могут назначаться как угодно. Также не обязательно, чтобы в конструкторе происходила установка атрибутов объекта. Там может быть, например, код, который порождает создание объектов других классов.

__del__() - метод деструктор класса

Помимо конструктора объектов в языках программирования есть обратный ему метод – деструктор. Он вызывается для удаления объекта из памяти.

В языке программирования Python объект уничтожается, когда исчезают все связанные с ним переменные или им присваивается другое значение, в результате чего связь со старым объектом теряется. Удалить переменную можно с помощью команды языка del.

В классах Python функцию деструктора выполняет метод __del__().

Кроме того, мы можем определить в классе деструктор, реализовав встроенную функцию __del__(), который будет вызываться либо в результате вызова оператора del, либо при автоматическом удалении объекта. Например:

class Person:
    # конструктор
    def __init__(self, name):
        self.name = name  # устанавливаем имя

    # деструктор
    def __del__(self):
        print(self.name,"удален из памяти")

    def display_info(self):
        print("Привет, меня зовут", self.name)

person1 = Person("Tom")
person1.display_info()  # Привет, меня зовут Tom
del person1             # удаление из памяти
person2 = Person("Sam")
person2.display_info()  # Привет, меня зовут Sam
del person2             # удаление из памяти
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Вывод в консоль:

Привет, меня зовут Tom
Tom удален из памяти
Привет, меня зовут Sam
Sam удален из памяти
1
2
3
4

Упражнения

  1. Есть класс Person, конструктор которого принимает три параметра (не учитывая self) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.

  2. У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.

  3. Класс Person содержит деструктор, который выводит на экран фразу «До свидания, мистер …» (вместо троеточия должны выводиться имя и фамилия объекта).

  4. В основной ветке программы создайте три объекта класса Person. Посмотрите информацию о сотрудниках и увольте самое слабое звено.

  5. В конце программы добавьте функцию input("Press any key…"), чтобы скрипт не завершился сам, пока не будет нажат Enter. Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.