python - 改进 MutableSequence 和 MutableMapping 子类的 Pythonic 方法
问题描述
最近我需要实现一些数据结构,这些数据结构可以判断它们是否自给定时间点以来被修改过。目前我有一个实现检查的 ChangeDetectable 类,但设置标志的实现留给子类。这是一个最小的例子:
ChangeDetectable 类:
class ChangeDetectable:
def __init__(self):
self._changed = False
def save_state(self):
self._changed = False
def has_changed(self) -> bool:
return self._changed
类列表类:
class MyList(MutableSequence, ChangeDetectable):
def __init__(self):
super().__init__()
self._list = list()
def __getitem__(self, item):
return self._list.__getitem__(item)
def __setitem__(self, key, value):
self._list.__setitem__(key, value)
self._changed = True
def __delitem__(self, key):
self._list.__delitem__(key)
self._changed = True
def __len__(self):
return self._list.__len__()
def insert(self, index, item):
self._list.insert(index, item)
self._changed = True
类字典类:
class MyDict(MutableMapping, ChangeDetectable):
def __init__(self):
super().__init__()
self._dict = dict()
def __getitem__(self, key):
return self._dict.__getitem__(key)
def __setitem__(self, key, value):
self._dict.__setitem__(key, value)
self._changed = True
def __delitem__(self, key):
self._dict.__delitem__(key)
self._changed = True
def __iter__(self):
return self._dict.__iter__()
def __len__(self):
return self._dict.__len__()
所以我的问题是:现在孩子们必须实施正确的写操作。例如 MyList 需要 insert 方法,而 MyDict 不需要。有没有办法在父级中实现我可能需要的所有方法,然后只在子级中继承我需要的方法?这可以使代码更干净,因为它会有 super() 但我不想在 MyDict 中插入。
谢谢你。
解决方案
让我给你一个笼统的答案。
抽象基类
这方面的官方文档非常好:https ://docs.python.org/3/library/abc.html 。
还请看一下这个 SO 问题:Python 中的元类是什么?
您创建一个类MyABC
,然后定义所有必须实现的方法并将它们标记为@abstractmethod
. 例如,如果MyList
并且MyDict
必须实现values
,那么您应该values
在 MyABC 中定义一个方法。MyList
并MyDict
从 MyABC 继承,并且必须实现values
,如本答案所示。
如果MyDict
实现特定于它的东西,作为字典,那么它只是定义和实现myKeys
.
为什么在Python中使用抽象基类?.
推荐阅读
- php - 如何使用 wp_enqueue_script 更改 foreach 内部的顺序?
- javascript - JavaScript 在 Firefox、Chrome 中不起作用 - 在 IE、Edge 中起作用
- matlab - 去趋势后如何恢复原始数据?
- c# - 显示错误“命名空间不能直接包含字段或方法等成员”的 C# 代码
- javascript - Blazor 在哪里存储表单数据?
- javascript - 我们如何使用 Json 路径向 JSON 字符串添加元素?
- r - 表示每个元素百分比的向量
- javascript - 使用 JavaScript 选择具有特定范围的 DIV 中的文本
- swift - 我正在尝试将特定的处理程序和 alertStyles 添加到我的警报中,但我使用的是没有处理程序的全局警报
- java - 下面的代码不适用于 Chrome 浏览器