【发布时间】:2014-09-18 14:48:08
【问题描述】:
当实现一个像集合一样工作的类时,可以从collections.MutableSet 继承,如果你实现了新类所需的方法,它将赋予新类多个 mixin 方法。 (换句话说,集合的某些方法可以用其他方法来实现。为了让您免于无聊,collections.MutableSet 和朋友只包含这些实现。)
The docs 说抽象方法是:
__contains__、__iter__、__len__、add、discard
混合方法是
继承
Set方法和clear、pop、remove、__ior__、__iand__、__ixor__和__isub__
(而且,要明确的是,update 不是“继承的Set 方法的一部分,Set 的混合方法是:
__le__、__lt__、__eq__、__ne__、__gt__、__ge__、__and__、__or__、__sub__、isdisjoint和@p98 >
不过,Set 指的是不可变集合,自然不会有update。)
为什么update 不在这些方法之列? 我发现set 包含此方法,但collections.Set 没有,这令人惊讶——甚至不直观。例如,它会导致以下情况:
In [12]: my_set
Out[12]: <ms.MySet at 0x7f947819a5d0>
In [13]: s
Out[13]: set()
In [14]: isinstance(my_set, collections.MutableSet)
Out[14]: True
In [15]: isinstance(s, collections.MutableSet)
Out[15]: True
In [16]: s.update
Out[16]: <function update>
In [17]: my_set.update
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-9ed968a9eb18> in <module>()
----> 1 my_set.update
AttributeError: 'MySet' object has no attribute 'update'
也许奇怪的是MutableMapping 确实提供了一个update 方法,而MutableSet 没有。 AFAICT,source code 没有提到任何原因。
【问题讨论】:
-
这是一个问题还是错误报告?
-
@AaronHall:哈!这是个好问题。它可能只是。我总是认为我的代码是问题所在,也许有人知道我不知道的事情。再看一遍,我不确定。 (如果有原因,错误报告可能会找出原因。)
-
归档issue 22089。
-
加一个,但经过进一步思考,我认为您不会获得太大的吸引力。请参阅下面的答案。
标签: python collections set mixins