Съдържание
В Python има така наречени "магически" методи, тоест методи, които са конструирани и имат специално име и се извикват само при определени обстоятелства, тъй като директното извикване на тези методи не е обичайно в обхвата на програмата.Строители
Методът __в него__ той е отговорен да действа като конструктор, тоест, че ще инициализира поредица от атрибути и ще изпълни кода, който дефинираме в момента на създаването на обект от класа, като се нарича "__init__" с две подчертавания в началото и края на думата init, тогава вече имате подходящ синтаксис за това Python приемете го като „магически“ метод и знайте, че той трябва да бъде изпълнен при създаване на екземпляр на класа.
Това, което конструкторът постига е, че вместо да прави следното за инициализиране на обект:
>>> f = FooBar () >>> f.init ()
Вече поставяйки този код, обектът инициализира своите атрибути само с помощта на:
>>> f = FooBar ()
Както можете да видите, това е важно спестяване при кодиране и помощ в случай, че забравим да инициализираме обекта.
Създаване на конструктора
Създайте конструктора в Python Това е съвсем просто, просто трябва да дефинираме метода и да добавим какво трябва да се направи, когато обектът е създаден, нека видим пример:
В изображението можете да видите определения метод и в това, което трябва да изпълни, виждаме, че той дефинира атрибута somevar и се равнява на 42. Нека видим пример за това как един обект от този клас би работил:
На изображението виждаме, че при дефиниране на обекта f от типа FooBar Той се инициализира и при достъп до неговия атрибут somevar отпечатва 42, което е стойността, определена в конструктора.
Какво се случва, ако искаме атрибутите да бъдат динамично инициализирани, нека пренапишем метода, както следва:
клас FooBar: def __init __ (self, стойност = 42): self.somevar = стойност
Определяйки незадължителния параметър, можем да предадем стойност, в случай че не я предадем, тя ще вземе 42 като стойност по подразбиране.
Изпълнението на програмата ще бъде както следва:
>>> f = FooBar ('Това е аргумент на конструктор') >>> f.somevar 'Това е аргумент на конструктор'
По този начин ние направихме нашия конструктор динамичен, така че да можем да присвояваме различни атрибути на нашите обекти в зависимост от нашите нужди в програмата.
Презаписване на конструктора
Има моменти, когато трябва да наследим от суперкласовете, за това понякога трябва да презапишем конструктора, нека видим следния пример, за да разберем за какво става въпрос:
Тук създадохме клас, наречен Bird, където конструкторът определя атрибута на гладно, изпълняваме следното и виждаме как работи:
>>> b = Bird () >>> b.eat () Aaaah… >>> b.eat () Не, благодаря!
Какво става, ако наследим от този клас, нека видим следния код:
клас SongBird (Bird): def __init __ (self): self.sound = 'Squawk!' def sing (self): отпечатайте self.sound
Пускаме малка програма:
>>> sb = SongBird () >>> sb.sing () Squawk!
Сега, ако извикаме метода eat (), ще видим грешка:
>>> sb.eat () Проследяване (последно последно обаждане): Файл "", ред 1, в? Файл „birds.py“, ред 6, в eat if self.hungry: AttributeError: Екземплярът SongBird няма атрибут „гладен“
Изключението ни казва, че атрибутът hungry не съществува, затова трябва да извикаме конструктора на супер класа в нашия конструктор:
клас SongBird (Bird): def __init __ (self): Bird .__ init __ (self) self.sound = 'Squawk!' def sing (self): отпечатайте self.sound
Сега при изпълнение на кода всичко ще работи без проблеми:
>>> sb = SongBird () >>> sb.sing () Squawk! >>> sb.eat () Aaaah … >>> sb.eat () Не, благодаря!
С това приключваме урока, вече знаем как да използваме метода __init__ по основен начин и как да го направим, когато трябва да наследим от по -висок клас.Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка