Python - Строители

{title}

В Python существуют так называемые «магические» методы, то есть методы, которые создаются и имеют специальное имя и вызываются только при определенных обстоятельствах, поскольку прямой вызов этих методов не является обычным в рамках программы.
конструкторы
Метод __init__ отвечает за работу в качестве конструктора, то есть он инициализирует ряд атрибутов и выполняет код, который мы определяем при создании объекта класса, когда он называется «__init__» с двумя подчеркиваниями. В начале и конце слова init у вас уже есть соответствующий синтаксис для Python, чтобы он воспринимал его как «магический» метод и знал, что он должен выполняться при создании экземпляра класса.
Что делает строитель, так это вместо того, чтобы делать следующее для инициализации объекта:

 >>> f = FooBar () >>> f.init () 

Размещая этот код, объект инициализировал свои атрибуты только используя:
 >>> f = FooBar () 

Как вы можете видеть, это важная экономия при кодировании и помощь, если мы забываем инициализировать объект.
Создание застройщика
Создать конструктор в Python довольно просто, нам просто нужно определить метод и добавить, что должно быть сделано при создании объекта, давайте рассмотрим пример:

{title}


На изображении вы видите определенный метод и в том, что вы должны выполнить, мы видим, что он определяет атрибут submit и равен ему 42. Давайте посмотрим пример того, как будет работать объект этого класса:

{title}


На рисунке мы видим, что в момент определения объекта f типа FooBar он инициализируется и при доступе к его атрибуту отправляет отпечатки 42, которые являются значением, определенным в конструкторе.
Теперь, что произойдет, если мы хотим, чтобы атрибуты были динамически инициализированы, давайте перепишем метод следующим образом:
 класс FooBar: def __init __ (self, value = 42): self.somevar = value 

Делая необязательный параметр, мы можем передать значение, в случае, если мы не передадим его, в качестве значения по умолчанию будет использовано значение 42.
Выполнение программы будет следующим:
 >>> f = FooBar ('Это аргумент конструктора') >>> f.somevar 'Это аргумент конструктора' 

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

{title}


Здесь мы создали класс с именем Bird, где конструктор определяет голодный атрибут, мы выполним следующее и посмотрим, как он работает:
 >>> b = Bird () >>> b.eat () А-а-а-а ... >>> b.eat () Нет, спасибо! 

Теперь, что произойдет, если мы наследуем от этого класса, давайте посмотрим на следующий код:
 Класс SongBird (Bird): def __init __ (self): self.sound = 'Squawk!' def sing (self): печатать self.sound 

Мы запускаем небольшую программу:
 >>> sb = SongBird () >>> sb.sing () Squawk! 

Теперь, если мы вызовем метод eat (), мы увидим ошибку:
 >>> sb.eat () Traceback (последний вызов был последним): файл "", строка 1, в? Файл «birds.py», строка 6, есть, если self.hungry: AttributeError: Экземпляр SongBird не имеет атрибута «голодный» 

Исключение говорит нам, что голодного атрибута нет, поэтому мы должны вызвать конструктор суперкласса внутри нашего конструктора:
 класс SongBird (Bird): def __init __ (self): Bird .__ init __ (self) self.sound = 'Squawk!' def sing (self): печатать self.sound 

Теперь при выполнении кода все будет работать гладко:
 >>> sb = SongBird () >>> sb.sing () Squawk! >>> sb.eat () А-а-а-а ... >>> sb.eat () Нет, спасибо! 

На этом мы завершим урок, мы уже знаем, как использовать метод __init__ основным способом и как это делать, когда мы должны наследовать от более высокого класса.