我想创建一个自定义集,它会自动将对象转换为另一种形式,以便在集合中存储(参见Using a Python Dictionary as a key non-nested)作为背景。
如果我覆盖add
,remove
,__contains__
,__str__
,update
,__iter__
,这将足以让其他人操作行为正常,还是我需要覆盖其他任何内容?
答案 0 :(得分:7)
正如@ kaizer.se建议的那样,在collections
的抽象类中工作是2.6中的适当解决方案(不确定为什么要调用超级 - 你试图委托哪些功能不能最好通过遏制而不是继承来完成?!)。
确实,你没有得到update
- 通过提供抽象方法,你得到__le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__ __sub__, __xor__, and isdisjoint
(来自collections.Set
)加clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__
(来自{{ 1}}),这远远超过你从子类collections.MutableSet
得到的(你必须覆盖每个感兴趣的方法)。你只需要提供你想要的其他设定方法。
请注意,像set
这样的抽象基类是一个与具体类完全不同的野兽,包括collections.Set
和(在2.6中)古老的set
等内置函数,已被弃用,但仍然存在(在Python 3中删除)。 ABCs意味着继承(并且一旦你实现所有的抽象方法就可以合成你的一些方法,你必须),其次是“注册”类,所以它们看起来好像是从它们继承的,即使它们没有(使sets.Set
更有用和有用)。
这是Python 3.1和2.6的一个工作示例(没有充分理由使用3.0,因为3.1只有优势,没有缺点):
isinstance
答案 1 :(得分:1)
在Python 2.6中:
import collections
print collections.MutableSet.__abstractmethods__
# prints:
# frozenset(['discard', 'add', '__iter__', '__len__', '__contains__'])
子类collections.MutableSet
并覆盖上面列表中的方法。
更新方法本身非常简单,只要实现上述最低限度
def update(self, iterable):
for x in iterable:
self.add(x)