首页 > 解决方案 > 改进 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 中插入。

谢谢你。

标签: pythoninheritance

解决方案


让我给你一个笼统的答案。

抽象基类

这方面的官方文档非常好:https ://docs.python.org/3/library/abc.html 。

还请看一下这个 SO 问题:Python 中的元类是什么?

您创建一个类MyABC,然后定义所有必须实现的方法并将它们标记为@abstractmethod. 例如,如果MyList并且MyDict 必须实现values,那么您应该values在 MyABC 中定义一个方法。MyListMyDict从 MyABC 继承,并且必须实现values,如本答案所示。

如果MyDict实现特定于它的东西,作为字典,那么它只是定义和实现myKeys.

为什么在Python中使用抽象基类?.


推荐阅读