Изменение встроенного метода 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 шт):
Вы переопределяете переменную new_dict новым экземпляром словаря. Причём это будет экземпляр стандартного типа dict без переопределённого метода:
new_dict = MyDict() # <class '__main__.MyDict'>
new_dict = {'Ikari': 1, 'Asuka': 2, 'Rei': 3} # <class 'dict'>
Вы не сможете ничего с этим сделать. Создание объектов с использованием литералов всегда будет возвращать стандартные типы данных. Переопределить их в коде не получится
Попробуйте так
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')}")