__init__()
- метод создания класса
В объектно-ориентированном программировании конструктором класса называют метод, который автоматически вызывается при создании объектов. Его также можно назвать конструктором объектов класса. Имя такого метода обычно регламентируется синтаксисом конкретного языка программирования. В Python же роль конструктора играет метод __init__()
.
В Python наличие пар знаков подчеркивания спереди и сзади в имени метода говорит о том, что он принадлежит к группе методов перегрузки операторов. Если подобные методы определены в классе, то объекты могут участвовать в таких операциях как сложение, вычитание, вызываться как функции и др.
При этом методы перегрузки операторов не надо вызывать по имени. Вызовом для них является сам факт участия объекта в определенной операции. В случае конструктора класса – это операция создания объекта. Так как объект создается в момент вызова класса по имени, то в этот момент вызывается метод __init__()
, если он определен в классе.
Необходимость конструкторов связана с тем, что нередко объекты должны иметь собственные свойства сразу. Пусть имеется класс Person, объекты которого обязательно должны иметь имя и фамилию. Если класс будет описан подобным образом:
class Person:
def setName(self, n, s):
self.name = n
self.surname = s
2
3
4
то создание объекта возможно без полей. Для установки имени и фамилии метод setName() нужно вызывать отдельно:
p1 = Person()
p1.setName("Bill", "Ross")
print(p1.name, p1.surname) # Bill Ross
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
2
3
4
5
6
7
Здесь при вызове класса в круглых скобках передаются значения, которые будут присвоены параметрам метода __init__()
. Первый его параметр – self – ссылка на сам только что созданный объект.
Теперь, если мы попытаемся создать объект, не передав ничего в конструктор, то будет возбуждено исключение, и объект не будет создан:
p1 = Person()
В консоль выводиться ошибка: «отсутствует 2 обязательных позиционных аргумента: "n" и "s":
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() missing 2 required positional arguments: 'n' and 's'
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
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 # удаление из памяти
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Вывод в консоль:
Привет, меня зовут Tom
Tom удален из памяти
Привет, меня зовут Sam
Sam удален из памяти
2
3
4
Упражнения
Есть класс Person, конструктор которого принимает три параметра (не учитывая self) – имя, фамилию и квалификацию специалиста. Квалификация имеет значение заданное по умолчанию, равное единице.
У класса Person есть метод, который возвращает строку, включающую в себя всю информацию о сотруднике.
Класс Person содержит деструктор, который выводит на экран фразу «До свидания, мистер …» (вместо троеточия должны выводиться имя и фамилия объекта).
В основной ветке программы создайте три объекта класса Person. Посмотрите информацию о сотрудниках и увольте самое слабое звено.
В конце программы добавьте функцию
input("Press any key…")
, чтобы скрипт не завершился сам, пока не будет нажат Enter. Иначе вы сразу увидите как удаляются все объекты при завершении работы программы.