Что выведет код Junior ООП и dataclasses обновлено

Атрибут класса и атрибут экземпляра

Вопрос

Что выведет код? По строке на каждый print.

class Counter:
    total = 0
    def __init__(self):
        self.total += 1

a = Counter()
b = Counter()
print(a.total, b.total, Counter.total)
Counter.total = 10
c = Counter()
print(a.total, c.total)

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: 1 1 0, 1 11. self.total += 1 читает total из класса (0), а пишет в экземпляр.

Что выведет

1 1 0
1 11

Разбор

self.total += 1 читает total из класса (0), а пишет в экземпляр. Поэтому у каждого экземпляра свой total = 1, а атрибут класса остаётся 0. После Counter.total = 10 новый экземпляр прочитает 10 и запишет себе 11, у a по-прежнему свой 1. Чтобы считать экземпляры, пишут Counter.total += 1 или type(self).total += 1.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме