Объектно-ориентированное программирование

Класс, __init__, атрибуты экземпляра и методы

Содержание курса

Атрибуты экземпляра и методы экземпляра

Когда __init__ запущен, у нас есть self — свежий пустой объект. Чтобы объект стал полезным, нужно записать в него данные. Делается это простым присваиванием через точку:

class Counter:
    def __init__(self, name):
        self.name = name
        self.value = 0

self.name и self.value — это атрибуты экземпляра. После того как __init__ отработал, они живут внутри объекта и доступны везде, где есть ссылка на этот объект. Прочитать их можно точно так же: объект.атрибут.

Важный момент: self.name и просто name — разные вещи. name — это локальный параметр __init__, он исчезнет, когда метод завершится. self.name — это данные, привязанные к объекту, они останутся.

c = Counter('A')
print(c.name)   # 'A'
print(c.value)  # 0

Теперь про методы. Метод экземпляра — это обычная функция внутри класса, первым параметром которой всегда идёт self. Через self метод получает доступ к атрибутам именно того объекта, на котором он вызван:

class Counter:
    def __init__(self, name):
        self.name = name
        self.value = 0

    def increment(self, step=1):
        self.value += step

    def reset(self):
        self.value = 0

    def status(self):
        return f"{self.name}: {self.value}"

Когда пишем c.increment(3), Python внутри делает вот что: берёт объект c, передаёт его как self в метод increment, передаёт 3 как step. Метод читает self.value, прибавляет 3 и записывает результат обратно — всё это происходит с атрибутом именно объекта c.

c = Counter('A')
c.increment(3)
print(c.status())  # A: 3
c.reset()
print(c.status())  # A: 0

Методы могут не только изменять атрибуты, но и читать их и возвращать результат — как status() выше. Ключевой принцип один: всё взаимодействие с данными объекта идёт через self. Нет self — нет доступа к состоянию конкретного экземпляра.