Не могу понять как мне переопределить класс dict и его метод get?

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

class MyDict(dict):
    def __init__(self, *args, **kw):
        super(MyDict, self).__init__(*args, **kw)

    def __get__(self, instance, owner):
        return 0


mydict = MyDict()
mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

Дальше я в ступоре, помогите пожалуйста.


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

Автор решения: Alpensin
class MyDict(dict):
    def __init__(self, *args, **kw):
        super(MyDict, self).__init__(*args, **kw)

    def __missing__(self, key):
        return 0

    def get(self, key):
        return self.__getitem__(key)

Метод __missing__ будет вызван, если __getitem__ не найдёт нужный элемент. Как написал vitidev, вам нужно по-другому передавать элементы. У вас просто mydict начинает ссылаться на обычный словарь. Заполнять его нужно так

mydict.update({'one': 1, 'two': 2, 'three': 3, 'four': 4})
→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Самый простой способ это переопределить метод get:

class MyDict(dict):
    def get(self, key, default=None):
        return super().get(key, 0)

d = MyDict({"a": 1, "b": 2})
print(d.get("a"))
print(d.get("c"))

Вывод:

1
0
→ Ссылка
Автор решения: Taigr

Как вариант, создать класс на основе встроенного словаря, и переопределить метод get с аргументом default, равным 0. Затем вызвать метод get встроенного словаря.

Нечто подобное предлагали выше, но в той реализации нет возможности указать методу mydict.get аргумент default, отличный от нуля (это не возымеет действия)

class mydict(dict):
    def get(self, key, default=0):
        return dict.get(self, key, default)
→ Ссылка