Использование общего словаря в классе

Рейтинг: 1Ответов: 1Опубликовано: 07.03.2023

Не могу понять причину не накопления данных в словаре

class CLASS_A:
    def __init__(self):
        self.classDict = {
            'a': 'aaaa',
            'b': '',
        }

class CLASS_B(CLASS_A):
    def __init__(self):
        super().__init__()

    def funkB(self):
        print(self.classDict)
        self.classDict['b'] = 'bbbb'
        print(self.classDict)

class CLASS_C(CLASS_B):
    def __init__(self):
        super().__init__()

    def funkC(self):
        print(self.classDict)
        self.classDict.update({'c': 'cccc'})
        print(self.classDict)


tB = CLASS_B()
tB.funkB()
tC = CLASS_C()
tC.funkC()

Ожидается, что словарь classDict будет наполняться и в результате получу:

...
{'a': 'aaaa', 'b': 'bbbb', 'c': 'cccc'}

Но в реальности получаю такой вывод:

{'a': 'aaaa', 'b': ''}
{'a': 'aaaa', 'b': 'bbbb'}
{'a': 'aaaa', 'b': ''}
{'a': 'aaaa', 'b': '', 'c': 'cccc'}

Как правильно накапливать данные в словаре?

Ответы

▲ 4Принят
  1. Классовые переменные объявляются вне блока __init__ и без self:
class CLASS_A:
    classDict = {
        'a': 'aaaa',
        'b': '',
    }
  1. Код уже будет рабочий, но все изменения отражаются и в CLASS_B.classDict и в CLASS_A.classDict, поскольку это один и тот же объект. Если нужна независимость, то нужно пересоздать словарь в классе CLASS_B. И абстолютно также сделать в классе CLASS_C:
class CLASS_B(CLASS_A):
    classDict = dict(CLASS_A.classDict)
    #...
class CLASS_C(CLASS_B):
    classDict = dict(CLASS_B.classDict)
    #...