gar*_*ois 10 python data-structures
我需要一个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)
Run Code Online (Sandbox Code Playgroud)
几个简单的测试:
>>> 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'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |