Я пытаюсь создать подкласс метода python dictionary __getitem__
, сохраняя исходный тип класса при доступе к ha sh. Нет ответа в , правильно подклассифицировав или , идеальное переопределение , похоже, решило бы эту проблему. Например,
class MyDict(dict):
def __init__(self, data=None):
if not data:
data = {}
dict.__init__(self, data)
def __getitem__(self, key):
if key == 'b':
print('Found "b"')
return dict.__getitem__(self, key)
shallow_dict = MyDict(data={
'b': 'value'
})
# prints Found "b", as expected
x = shallow_dict['b']
deep_dict = MyDict(data={
'a': {
'b': 'value'
}
})
# prints nothing
x = deep_dict['a']['b']
Это происходит потому, что, когда мы обращаемся к ['b']
, мы фактически обращаемся к dict
, а не к MyDict
. Поэтому я попытался решить эту проблему, скопировав содержимое в новый объект:
def __getitem__(self, key):
data = dict.__getitem__(self, key)
if key == 'b':
print('Found "b"')
if isinstance(data, dict):
return MyDict(data)
return data
Однако это решение привело к новой проблеме при записи содержимого в ha sh, потому что я возвращаю копию и не ссылка:
deep_dict['a']['b'] = 'other value'
# prints 'value'
print(deep_dict['a']['b'])
Есть какие-нибудь предложения о том, как правильно поддерживать тип, поскольку копирование имело этот побочный эффект?