Шаг 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...>.
👎 Не клади изменяемые значения (списки) в атрибуты класса — они станут общими для всех экземпляров и начнут «протекать» между объектами.