← Все вопросы
В чём разница между атрибутом класса и атрибутом экземпляра?
16
Объявил переменную прямо в теле класса (не в __init__), и она будто общая для всех объектов. А self.x — у каждого свой. Можете объяснить разницу и где грабли?
3 ответа
25
✓ Принятый ответ — помог автору
Атрибут класса один на всех, атрибут экземпляра свой у каждого объекта.
class Dog:
kind = "собака" # атрибут класса — общий
def __init__(self, name):
self.name = name # атрибут экземпляра — личный
a = Dog("Рекс")
b = Dog("Шарик")
print(a.kind, b.kind) # собака собака — общий
print(a.name, b.name) # Рекс Шарик — у каждого свой
Главная грабля — изменяемые атрибуты класса (список/словарь): если объявить tricks = [] на уровне класса и делать self.tricks.append(...), то трюки будут общими у ВСЕХ собак, потому что список один. Списки и словари заводи в __init__ через self, чтобы у каждого объекта был свой.
Игорь Жуков ох, я как раз на этом списке и попался, спасибо что предупредил · 8 месяцев назад
7
Атрибут класса — типа "настройка по умолчанию для всех", атрибут экземпляра — "личные данные объекта". Для констант (вроде ставки налога, числа Pi) удобно держать на уровне класса.
3
Класса — общий, экземпляра — личный.
Ваш ответ
Войдите, чтобы ответить на вопрос.