gpt4 book ai didi

python - 在 Python 中重写 set 方法

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:06 25 4
gpt4 key购买 nike

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

如果我覆盖addremove__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

关于python - 在 Python 中重写 set 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1622722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com