Класс описывает данные и поведение объектов, а метод __init__ задаёт их начальное состояние.
Базовая структура класса
class ИмяКласса:
def __init__(self, параметры):
self.атрибут = значение
def метод(self):
pass
class Zombie:
def __init__(self, name, health):
self.name = name
self.health = health
def groan(self):
print(f"{self.name}: Граааах! 🧟")
walker = Zombie("Ходок", 50)
walker.groan() # Ходок: Граааах! 🧟
__init__: конструктор
__init__ вызывается автоматически при создании объекта. Аналогия: когда рождается ребёнок, ему сразу дают имя и дату рождения — __init__ делает то же самое для объектов.
class Human:
def __init__(self, name, health, age):
self.name = name
self.health = health
self.age = age
self.kills = 0 # можно задать значение по умолчанию
rick = Human("Рик", 100, 35)
print(rick.name) # Рик
print(rick.kills) # 0 (хотя не передавали!)
Когда пишете Human("Рик", 100, 35), Python автоматически вызывает __init__(self, "Рик", 100, 35).
self: ссылка на объект
self — ссылка на конкретный объект. Когда пишете self.name, говорите: “атрибут name этого объекта”.
Без self не работает:
class Zombie:
def __init__(self, name):
name = name # ❌ локальная переменная, умрёт после __init__
walker = Zombie("Ходок")
print(walker.name) # AttributeError!
С self работает:
class Zombie:
def __init__(self, name):
self.name = name # ✅ атрибут объекта, сохраняется
walker = Zombie("Ходок")
print(walker.name) # Ходок
Каждый объект хранит свои атрибуты:
walker = Zombie("Ходок", 50)
runner = Zombie("Бегун", 30)
print(walker.name) # Ходок
print(runner.name) # Бегун ← свой атрибут!
print(walker.health) # 50
print(runner.health) # 30
self в методах
class Zombie:
def __init__(self, name, health):
self.name = name
self.health = health
def groan(self):
print(f"{self.name}: Граааах!") # self.name — атрибут объекта
def take_damage(self, damage):
self.health -= damage # изменяем атрибут
print(f"{self.name} получил {damage} урона. Здоровье: {self.health}")
def attack(self):
self.groan() # вызов другого метода через self
print(f"{self.name} атакует!")
walker = Zombie("Ходок", 50)
walker.take_damage(20) # Ходок получил 20 урона. Здоровье: 30
walker.attack() # Ходок: Граааах! / Ходок атакует!
Параметры по умолчанию
class Zombie:
def __init__(self, name, health=50, speed=2):
self.name = name
self.health = health
self.speed = speed
walker = Zombie("Ходок") # health=50, speed=2 (по умолчанию)
runner = Zombie("Бегун", 30, 5) # health=30, speed=5
print(walker.health) # 50
print(runner.speed) # 5
Параметры с умолчанием должны идти после обязательных.
Частые ошибки
Ошибка 1: Забыли self. — атрибут не сохранится
def __init__(self, name):
name = name # ❌ — self.name = name ✅
Ошибка 2: Забыли self в параметрах метода
def __init__(name): # ❌ нет self — TypeError
def __init__(self, name): # ✅
Ошибка 3: Опечатка в __init__
def _init_(self, name): # ❌ одно подчёркивание — не сработает
def __init__(self, name): # ✅ два подчёркивания с каждой стороны
Ошибка 4: Обращение к атрибуту без self в методе
def groan(self):
print(f"{name}: Граааах!") # ❌ NameError
print(f"{self.name}: Граааах!") # ✅
Итого
__init__ — конструктор, вызывается автоматически при ИмяКласса(аргументы).
self — ссылка на объект, позволяет:
- сохранять атрибуты: self.name = name
- читать атрибуты в методах: print(self.name)
- вызывать методы: self.другой_метод()
class ИмяКласса:
def __init__(self, параметры):
self.атрибут = значение
объект = ИмяКласса(аргументы)
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!