为了示例起见,假设我想要子类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

这不是我们想要的行为.

现在,懒散地填充所有可以从"核心"方法派生的方法

有办法吃我的蛋糕吗?让MutableMapping只看到我重写过的方法,这样它就可以在这些方法的基础上重新实现其他方法了?

推荐答案

What you could do:

这可能不会很好地解决问题(即不是最干净的设计),但您可以先从MutableMapping秒继承,然后从dict秒继承.

然后MutableMapping将使用您实现的任何方法(因为它们是查找链中的第一个):

>>> class D(MutableMapping, dict):
        def __getitem__(self, key):
            print(f'Intercepted a lookup for {key!r}')
            return dict.__getitem__(self, key)


>>> d = D(x=10, y=20)
>>> d.get('x', 0)
Intercepted a lookup for 'x'
10
>>> d.get('z', 0)
Intercepted a lookup for 'z'
0

Better way:

最干净的方法(易于理解和测试)是仅从MutableMapping继承,然后使用常规dict作为基础数据存储实现所需的方法(使用组合而不是继承):

>>> class CapitalizingDict(MutableMapping):
        def __init__(self, *args, **kwds):
            self.store = {}
            self.update(*args, **kwds)
        def __getitem__(self, key):
            key = key.capitalize()
            return self.store[key]
        def __setitem__(self, key, value):
            key = key.capitalize()
            self.store[key] = value
        def __delitem__(self, key):
            del self.store[key]
        def __len__(self):
            return len(self.store)
        def __iter__(self):
            return iter(self.store)
        def __repr__(self):
            return repr(self.store)


>>> d = CapitalizingDict(x=10, y=20)
>>> d
{'X': 10, 'Y': 20}
>>> d['x']
10
>>> d.get('x', 0)
10
>>> d.get('z', 0)
0
>>> d['w'] = 30
>>> d['W']
30

Python-3.x相关问答推荐

如何在matplotlib中显示次要刻度标签

以编程方式关闭jupyterlab内核

我正在try 从 10*3 矩阵中删除随机值并将其变为 10*2 矩阵

Select 作为 MultiIndex 一部分的两个 DatetimeIndex 之间的行

添加任意数量的 pandas 数据框

比较和排序 DataFrame 两列中的值并在 python 中的同一行中排序

隐藏Cartopy中高纬度非矩形投影的右侧轴(纬度)标签

仅当从 USB 摄像头接收到新图像时才处理图像

asyncio.as_completed() 应该接受 `Iterable`,但如果输入是 `Generator` 就会崩溃?

txt 文件与不同的分隔符到整数列表

将元组列表转换为以整个元组为键的字典列表

Python BeautifulSoup:在 Select 语句中排除其他标签

根据另一列值对多个数据框列进行分组

如何将 SimpleGUI 与 Python 2.7 和 3.0 shell 集成

在 Pandas 数据框中显示对图

迭代dict值

__cause__ 和 __context__ 有什么区别?

接收导入错误:没有名为 *** 的模块,但有 __init__.py

计算两个文件的行差异的最有效方法是什么?

具有不均匀间隙的 Python 范围