我想创建一个自定义集合,它会自动将对象转换为不同的形式以存储在集合中(参见 Using a Python Dictionary as a key non-nested )作为背景。
如果我覆盖add、remove、__contains__、__str__、update , __iter__,这是否足以使其他操作正常运行,或者我是否需要覆盖其他任何内容?
请您参考如下方法:
从 collections 的抽象类开始工作,正如@kaizer.se 所建议的那样,是 2.6 中的适当解决方案(不确定为什么要调用 super - 你试图委托(delegate)什么功能难道不能通过包含而不是继承来完成吗?!)。
的确,您没有得到 update——通过提供抽象方法,您确实得到了 __le__、__lt__、__eq__、__ne__、__gt__、__ge__、__and__、__or__ __sub__、 __xor__ 和 isdisjoint(来自 collections.Set)加上 clear、pop、remove、__ior__、__iand__、__ixor__ 和 __isub__(来自 collections. MutableSet),这远远超过您从子类化 set 中获得的(您必须重写感兴趣的每个方法)。您只需提供所需的其他设置方法。
请注意,像 collections.Set 这样的抽象基类与具体类完全不同,包括 set 和(在 2.6 中)良好的旧 sets.Set,已弃用但仍然存在(在 Python 3 中删除)。 ABCs 旨在继承(并且一旦你实现了所有抽象方法,就可以从你那里合成一些方法,这是你必须的),其次是为了“注册”类,所以它们看起来就像是从它们继承的,即使它们没有(使 isinstance 更有用和有用)。
这是 Python 3.1 和 2.6 的工作示例(没有充分的理由使用 3.0,因为 3.1 相对于它只有优势,没有劣势):
import collections
class LowercasingSet(collections.MutableSet):
def __init__(self, initvalue=()):
self._theset = set()
for x in initvalue: self.add(x)
def add(self, item):
self._theset.add(item.lower())
def discard(self, item):
self._theset.discard(item.lower())
def __iter__(self):
return iter(self._theset)
def __len__(self):
return len(self._theset)
def __contains__(self, item):
try:
return item.lower() in self._theset
except AttributeError:
return False
