Вопросы по ООП в python

Изучаю базу питона по книге bite of python.

Случилась неувязка в голове которую не могу никак объяснить, а именно:

После объявления класса идёт метод инициализации, а далее идёт метод __del__ со своим алгоритмом вывода текста и воздействием на переменную класса.

В конце объявляю новую переменную droid1 в которой храниться класс? Вот тут начинаются вопросы.

  1. Каким образом "Помещая" класс в переменную он автоматически запускается?? Я думал переменная просто хранит определенный объект со значением, а тут оказывается что он просто запустился из переменной..

  2. В любом случае на выводе я получил три строки. Первая ясно что из метода инициализации класса. Но вторая, каким образом метод __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 шт):

Автор решения: Эникейщик
  1. Класс не запускается. При создании объекта класса выполняется метод __init__(). Она и печатает первую строку.

  2. Метод __del__() срабатывает, когда удаляется объект класса. Вы запускали код в IDE (возможно, PyCharm), она подчистила за собой память и удалила droid1. Если вы запустите свой код в IDLE (простенький редактор, который идет вместе с дистрибутивом питона), то метод __del__() не будет вызван и выведется только строчка с инициализацией.

Методы SayHi() и HowMany() никто не вызывал, потому они не выполнялись.


Интересно будет, если вы добавите строчку :)

droid2 = Robot("HAL")

Инициализация R2-D2

Инициализация HAL

Робот R2-D2 уничтожен

Осталось 1 работающих роботов.

Робот HAL уничтожен

Больше роботов не осталось. Робот HAL был последним

→ Ссылка
Автор решения: Kuznetcov Georgiy

Он не 'запускается'. А создаётся обьект класса Robot, запуская конструктор__init__ и присваивается в переменную. А когда программа завершается - python начинает уборку мусора и уничтожает обьект, запуская деструктор __del__. Поэтому ты и наблюдаешь такой вывод.

→ Ссылка