Объяснение к уроку
__init__После этого урока ты сможешь:
__init__ и инициализировать атрибуты экземпляра при создании объекта.self.В предыдущем уроке ты создавал класс и прикреплял атрибуты после создания каждого объекта. Это работает, но при таком подходе легко забыть добавить атрибут. Метод Python __init__ инициализирует экземпляр автоматически при вызове его класса:
class Task:
def __init__(self, name, owner):
self.name = name
self.owner = ownerTask("build", "Maya") создает объект и вызывает __init__ с переданными аргументами. Python передает self автоматически; тебе не нужно передавать его самостоятельно. В отличие от конструкторов в Java/C#, метод __init__ — это метод инициализации, и он обычно не возвращает значение.
Параметры конструктора — это временные входные данные. self.name и self.owner — это атрибуты экземпляра, которые остаются доступными через объект. Каждый вызов создает отдельный экземпляр со своим собственным сохраненным состоянием.
Значения по умолчанию из Части 1 работают и в __init__: запись def __init__(self, name, retries=0): позволяет вызывающему коду опускать количество повторных попыток. Располагай обязательные параметры перед необязательными.
class Endpoint:
def __init__(self, name, region):
self.name = name
self.region = region
endpoint = Endpoint("billing", "eu")
print(f"{endpoint.name}@{endpoint.region}")Вывод:
billing@euВходные данные конструктора становятся постоянными атрибутами экземпляра.
class Deployment:
def __init__(self, tag, ready):
self.tag = tag
self.ready = ready
first = Deployment("v1.4", True)
second = Deployment("v1.5", False)
print(first.ready)
print(second.ready)Вывод:
True
FalseВторой объект не перезаписывает состояние первого объекта.
class Queue:
def __init__(self, name, pending=0):
self.name = name
self.pending = pending
normal = Queue("email")
busy = Queue("reports", 4)
print(f"{normal.name}: {normal.pending}")
print(f"{busy.name}: {busy.pending}")Вывод:
email: 0
reports: 4Значение по умолчанию применяется только тогда, когда вызывающий код опускает аргумент.
class Wallet:
def __init__(self, owner, balance):
self.owner = owner
self.balance = balance
def deposit(self, amount):
if amount > 0:
self.balance += amount
wallet = Wallet("Ari", 20)
wallet.deposit(7)
print(f"Balance: {wallet.balance}")Вывод:
Balance: 27Методы изменяют инициализированное состояние с помощью self, а не временной локальной переменной.
| Цель | Синтаксис |
|---|---|
| Инициализировать экземпляр | def __init__(self, name): |
| Сохранить входные данные конструктора | self.name = name |
| Создать инициализированный объект | obj = ClassName(value) |
| Задать необязательное начальное значение | def __init__(self, name, count=0): |
| Обновить состояние объекта | self.count += amount |
name = name вместо self.name = name не сохраняет атрибут на экземпляре.self, вызывает AttributeError.__init__ вызывает TypeError; используй другие методы для возврата результатов.