Skip to main content
 首页 » 编程设计

python之在 Python 中重写 set 方法

2025年05月04日13Terrylee

我想创建一个自定义集合,它会自动将对象转换为不同的形式以存储在集合中(参见 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