4.1 Инициализация
Обычно сразу после создания объекты ещё не готовы к работе. Сначала в них нужно передать все необходимые данные: параметры работы, стартовые значения, ссылки на другие объекты и т.п.
Такой процесс называется инициализацией и должен проходить сразу после создания объекта.
Допустим, у вас есть класс Кот (Cat), и вы хотите задать ему имя и возраст, это можно сделать несколькими способами:
Инициализация атрибутов после создания объекта
В этом примере сначала создаётся:
- пустой объект
Cat. - экземпляр класса
Catс именемbarsik. - а затем у объекта
barsikустанавливаются два атрибута:nameиageдобавляются непосредственно к объекту.
class Cat:
pass
# Создание объекта Cat
barsik = Cat()
# Инициализация атрибутов после создания объекта
barsik.name = "Barsik"
barsik.age = 5
print(f"Имя кота: {barsik.name}, возраст: {barsik.age}") # Вывод: Имя кота: Barsik, возраст: 5
Использование метода для инициализации атрибутов
В этом примере для инициализации атрибутов используется метод initialize. Объект Cat создаётся без единого атрибута, а затем метод initialize() используется для задания значений атрибутов.
class Cat:
def initialize(self, name, age):
self.name = name
self.age = age
# Создание объекта Cat
barsik = Cat()
# Инициализация атрибутов через метод
barsik.initialize("Barsik", 5)
print(f"Имя кота: {barsik.name}, возраст: {barsik.age}") # Вывод: Имя кота: Barsik, возраст: 5
Использование полей класса
В этом примере атрибуты name и age определены на уровне класса. После создания объекта barsik атрибуты инициализируются непосредственно.
class Cat:
name = ""
age = 0
# Создание объекта Cat
barsik = Cat()
# Инициализация атрибутов объекта
barsik.name = "Barsik"
barsik.age = 5
print(f"Имя кота: {barsik.name}, возраст: {barsik.age}") # Вывод: Имя кота: Barsik, возраст: 5
Какой способ лучше? Никакой! Лучше всего использовать конструктор :)
4.2 Конструктор
Конструктор — это специальный метод, который автоматически вызывается при создании нового объекта класса. Конструктор используется для инициализации полей объекта и может выполнять любые начальные действия, необходимые для настройки объекта.
В Python конструктором является метод по имени __init__. Вот основные факты о нём:
- Метод
__init__— это конструктор в Python. Он вызывается автоматически, когда создаётся новый экземпляр класса. -
__init__принимает как минимум один параметр —self, который ссылается на создаваемый объект. Дополнительно могут быть переданы другие параметры для инициализации атрибутов объекта. - Внутри метода
__init__можно задавать начальные значения атрибутов объекта, используяself. - Конструктор может выполнять любые действия, необходимые для настройки объекта, например, проверку входных данных или установку связей с другими объектами.
Параметры передаются конструктору автоматически, вам нужно лишь указать их внутри круглых скобок во время создания объекта.
Вот как будет выглядеть инициализация нашего кота с использованием конструктора:
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
# Создание объекта Cat с именем и возрастом
barsik = Cat("Barsik", 5)
print(f"Имя кота: {barsik.name}, возраст: {barsik.age}") # Вывод: Имя кота: Barsik, возраст: 5
После создания объекта типа Cat будет автоматически вызван метод __init__, и в него передадутся три параметра:
- Ссылка на объект
barsikв параметрself - Строка «Барсик» в параметр
name - Число 5 в параметр
age
Это удобно и красиво.
Валидация данных
Также в конструкторе можно выполнять валидацию данных. Ведь цель конструктора — это сформировать валидный (правильный) объект, с которым дальше можно работать. Пример:
class Cat:
def __init__(self, name, age):
if age < 0: raise ValueError("Возраст не может быть отрицательным")
self.name = name
self.age = age
# Создание объекта Cat с проверкой возраста
try:
barsik = Cat("Barsik", -3)
except ValueError as e:
print(e) # Вывод: Возраст не может быть отрицательным
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ