Давайте для примера предположим, что я хочу создать подкласс dictи сделать все ключи заглавными:
class capdict(dict):
def __init__(self,*args,**kwds):
super().__init__(*args,**kwds)
mod = [(k.capitalize(),v) for k,v in super().items()]
super().clear()
super().update(mod)
def __getitem__(self,key):
return super().__getitem__(key.capitalize())
def __setitem__(self,key,value):
super().__setitem__(key.capitalize(),value)
def __delitem__(self,key):
super().__detitem__(key.capitalize())
Это работает до такой степени,
>>> ex = capdict(map(reversed,enumerate("abc")))
>>> ex
{'A': 0, 'B': 1, 'C': 2}
>>> ex['a']
0
но, конечно, только для методов, которые я запомнил, например, для реализации
>>> 'a' in ex
False
не желаемое поведение.
Теперь ленивый способ заполнения всех методов, которые могут быть получены из «основных», будет смешиваться collections.abc.MutableMapping. Только здесь это не работает. Я предполагаю, потому что рассматриваемые методы ( __contains__в примере) уже предоставлены dict.
Есть ли способ получить мой пирог и съесть его? Какая-то магия, позволяющая MutableMappingвидеть только те методы, которые я переопределил, чтобы переопределить другие, основанные на них?
os._Environ.
MutableMapping. Смотрите словарь без учета регистра .