覆盖Python中的set方法

时间:2009-10-26 01:30:02

标签: python python-3.x set

我想创建一个自定义集,它会自动将对象转换为另一种形式,以便在集合中存储(参见Using a Python Dictionary as a key non-nested)作为背景。

如果我覆盖addremove__contains____str__update__iter__,这将足以让其他人操作行为正常,还是我需要覆盖其他任何内容?

2 个答案:

答案 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)