Изменение встроенного метода Python OOP

Поставлена задача создать класс словарей MyDict так, чтобы метод get() по умолчанию возвращал не None, а 0.

Написал так:

class MyDict(dict):
    def get(self, key, default_value=0):
        if key in self.keys():
            return self[key]
        else:
            return default_value

И если делать так:

new_dict = MyDict()
new_dict['Ikari'] = 1
new_dict['Asuka'] = 2
new_dict['Rei'] = 3
print(new_dict.get('Misato'))

то все работает.


Но если присваивать сразу:

new_dict = MyDict()
new_dict = {'Ikari': 1,
         'Asuka': 2,
         'Rei': 3
         }

то new_dict.get('Misato') вернет None. Видимо присваивание с фигурными скобками автоматом создает объект встроенного класса (?).

Что тут можно сделать несложного, без переписывания типа dict со всеми методами?


Ответы (2 шт):

Автор решения: nomnoms12

Вы переопределяете переменную new_dict новым экземпляром словаря. Причём это будет экземпляр стандартного типа dict без переопределённого метода:

new_dict = MyDict()                            # <class '__main__.MyDict'>
new_dict = {'Ikari': 1, 'Asuka': 2, 'Rei': 3}  # <class 'dict'>

Вы не сможете ничего с этим сделать. Создание объектов с использованием литералов всегда будет возвращать стандартные типы данных. Переопределить их в коде не получится

→ Ссылка
Автор решения: S. Nick

Попробуйте так

class MyDict(dict):
    def get(self, key, default_value=0):
        if key in self.keys():
            return self[key]
        else:
            return default_value

new_dict = MyDict({'Ikari': 1, 'Asuka': 2, 'Rei': 3}) 
print(f"Misato: {new_dict.get('Misato')}")
print(f"Asuka : {new_dict.get('Asuka')}")
→ Ссылка