Python Schoolby trefilov
Шаг 1 из 3+120 XP

ООП: классы глубже

__init__, __repr__, методы, атрибуты класса vs объекта.

Атрибуты класса vs атрибуты объекта

Что это

Класс — это шаблон, а объект — конкретный экземпляр. У шаблона тоже могут быть свои поля (kind = "2D" принадлежит классу Point), а у каждого объекта — свои собственные (self.x, self.y).

Как это читать

class Point:
    kind = "2D"           # атрибут класса — общий для всех
    def __init__(self, x, y):
        self.x, self.y = x, y   # атрибуты экземпляра
    def __repr__(self):
        return f"P({self.x},{self.y})"
print(Point(1, 2))    # P(1,2)

- kind = "2D" лежит в самом классе — все точки видят это значение.
- __init__ запускается при создании объекта; self — это сам новый объект.
- __repr__ отвечает на вопрос «как тебя печатать?» — print(p) зовёт его автоматически.

Пример

class Dog:
    species = "Canis"            # один на всех собак
    def __init__(self, name):
        self.name = name         # своё для каждой
rex = Dog("Rex")
print(rex.species, rex.name)     # Canis Rex

👍 Используй __repr__, чтобы в отладке видеть нормальный текст вместо <__main__.Point object at 0x...>.
👎 Не клади изменяемые значения (списки) в атрибуты класса — они станут общими для всех экземпляров и начнут «протекать» между объектами.