📝 Python

Создаём классы: __init__ и self

P
Автор
PyLand Team
📅
Опубликовано
03.04.2026
⏱️
Время чтения
2 мин
👁️
Просмотров
374
🌿
Уровень
Средний

Класс описывает данные и поведение объектов, а метод __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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Event loop в Python: как asyncio создаёт параллел…

Event loop — сердце asyncio. Он не запускает код параллельно в нескольких потоках. Он переключается...

📅 30.06.2026 👁️ 387
📝

ООП: Программируй как создатель миров 🌍

Представь: ты создаёшь игру про зомби-апокалипсис. Нужны зомби, люди, оружие. Каждый зомби имеет имя, здоровье,...

📅 03.04.2026 👁️ 415
📝

Цикл while: повторяем пока условие истинно 🔁

Цикл for отлично работает когда знаешь сколько раз нужно повторить действие. Но что если неизвестно?

📅 30.03.2026 👁️ 406
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

Python с нуля: 7 практических проектов Открыть программу курса