Вопросы по ООП в python
Изучаю базу питона по книге bite of python.
Случилась неувязка в голове которую не могу никак объяснить, а именно:
После объявления класса идёт метод инициализации, а далее идёт метод __del__ со своим алгоритмом вывода текста и воздействием на переменную класса.
В конце объявляю новую переменную droid1 в которой храниться класс? Вот тут начинаются вопросы.
Каким образом "Помещая" класс в переменную он автоматически запускается?? Я думал переменная просто хранит определенный объект со значением, а тут оказывается что он просто запустился из переменной..
В любом случае на выводе я получил три строки. Первая ясно что из метода инициализации класса. Но вторая, каким образом метод
__del__сработал, а почему методы SayHi() и HiMany() в этом случае не сработали тогда?? Почему именно два первых?
Если в процедурном программировании алгоритм выполнения строго определён и понятен мне, то здесь я не понимаю в каком порядке выполняется алгоритм.
class Robot: # Создание класса
population = 0 # Переменная класса, содержащая колличество роботов
def __init__(self, name): # Метод инициализации
self.name = name # Введенная переменная с условным методом self
print('Инициализация {0}'.format(self.name))
Robot.population += 1
def __del__(self):
print('Робот {} уничтожен'.format(self.name))
Robot.population -= 1
if Robot.population == 0:
print('Больше роботов не осталось. Робот {0} был последним'.format(self.name))
else:
print('Осталось {0:d} работающих роботов.'.format(Robot.population))
def SayHi(self):
print('Имя данное мне {0}'.format(self.name))
def HowMany():
print('На данный момент у нас {} роботов'.format(Robot.population))
droid1 = Robot('R2-D2')
Ответы (2 шт):
Класс не запускается. При создании объекта класса выполняется метод
__init__(). Она и печатает первую строку.Метод
__del__()срабатывает, когда удаляется объект класса. Вы запускали код в IDE (возможно, PyCharm), она подчистила за собой память и удалилаdroid1. Если вы запустите свой код в IDLE (простенький редактор, который идет вместе с дистрибутивом питона), то метод__del__()не будет вызван и выведется только строчка с инициализацией.
Методы SayHi() и HowMany() никто не вызывал, потому они не выполнялись.
Интересно будет, если вы добавите строчку :)
droid2 = Robot("HAL")
Инициализация R2-D2
Инициализация HAL
Робот R2-D2 уничтожен
Осталось 1 работающих роботов.
Робот HAL уничтожен
Больше роботов не осталось. Робот HAL был последним
Он не 'запускается'. А создаётся обьект класса Robot, запуская конструктор__init__ и присваивается в переменную. А когда программа завершается - python начинает уборку мусора и уничтожает обьект, запуская деструктор __del__. Поэтому ты и наблюдаешь такой вывод.
