我需要一个 python list
对象,它在插入时会自动检查以下形式的某些约束:“A 必须始终位于 B 之前”或“如果包含 C,则它必须始终位于最后".
实现它的最简单/最快的方法是什么。显而易见的方法是覆盖列表数据类型的所有改变其内容的方法(append
、extend
、insert
等),并且验证约束在操作后仍然有效。只是这很乏味,因为有很多这样的方法。有没有更简单的方法?
最佳答案
我强烈建议从 collections.MutableSequence
抽象基类继承子类。缺点是它不会被识别为 list
的子类(如 user4815162342 指出的那样)。然而,只要使用结果类的人做的是正确的事情(即使用鸭子类型或将抽象基类而不是具体类传递给 isinstance
),这几乎无关紧要。
关于此的美妙之处在于,一旦您定义了以下方法,您将获得 MutableSequence
的其余部分界面免费。下面是 MutableSequence
的具体子类,您可以将其用作进一步自定义的模板。在您的情况下,您只需要自定义 __init__
、__setitem__
、insert
和 __delitem__
。其他一切都是根据这些定义的,因此将执行您插入的任何检查:
import collections
class MyList(collections.MutableSequence):
def __init__(self, it=()):
self._inner = list(it)
def __len__(self):
return len(self._inner)
def __iter__(self):
return iter(self._inner)
def __contains__(self, item):
return item in self._inner
def __getitem__(self, index):
return self._inner[index]
def __setitem__(self, index, value):
self._inner[index] = value
def __delitem__(self, index):
del self._inner[index]
def __repr__(self):
return 'MyList({})'.format(self._inner)
def insert(self, index, item):
return self._inner.insert(index, item)
一些简单的测试:
>>> ml = MyList('foo')
>>> ml
MyList(['f', 'o', 'o'])
>>> ml.append(5)
>>> ml
MyList(['f', 'o', 'o', 5])
>>> ml.reverse()
>>> ml
MyList([5, 'o', 'o', 'f'])
关于python - 实现一个带约束的 python 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442981/