Это один из способов сделать это с помощью подклассов:
class CustomDict(dict):
def __init__(self, dic):
self.dic = dic
def __getitem__(self, items):
values = []
for item in items:
values.append(self.dic[item])
return values if len(values) > 1 else values[0]
d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
new_d = CustomDict(d)
print(new_d['a'])
print(new_d['a', 'b'])
print(new_d['a', 'b', 'c'])
print(new_d['a', 'c', 'd'])
Вывод:
1
[1, 2]
[1, 2, 3]
[1, 3, 4]
Объяснение:
new_d
является объектом класса CustomDict
, он всегда будет прибегать к методам родительского класса (так что циклически перебирая объект и другие вещи, которые вы можете захотеть сделать для работы со словарем), за исключением случаев, когда один из переопределенных методов (init, getitem) вызывается.
Так что, когда используется new_d['a', 'b']
, вызывается переопределенный метод __getitem__
.Переопределенный метод использует __getitem__
из self.dic
(который является обычным словарем) для фактического доступа к значениям словаря для каждого заданного ключа.