← Все вопросы

В чём разница между атрибутом класса и атрибутом экземпляра?

Задан 9 месяцев назад841 просмотров3 ответа
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

Класса — общий, экземпляра — личный.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект