Python: 子类化frozenset不可迭代?

1 投票
1 回答
1023 浏览
提问于 2025-04-18 08:59

子类化(也就是从一个类派生出新的类)`frozenset`和`set`在处理可迭代对象时似乎表现得不太一样。你可以试着运行下面这个简单的例子:

class MonFrozenSet(frozenset):
    def __new__(self, data):
        super(MonFrozenSet,self).__init__(data)
        return self

class MonSet(set):
    def __init__(self, data):
        super(MonSet,self).__init__(data)



x=(1,2,3,4)

A=MonSet(x)
B=MonFrozenSet(x)

for y in A: #Works
    print y

for y in B: #Doesn't work
    print y

第二个 for 循环返回的是:

for y in B:
TypeError: 'type' object is not iterable

有没有人知道我该怎么解决这个问题?

如果你们在想我为什么想用`frozenset`,答案是我想创建一个包含元组集合的集合。元组的集合会用`frozenset`来表示,而这些元组集合的集合则会用`set`来表示。

我使用的是Python 2.7。

1 个回答

7

当你重写 __new__ 方法时,你需要调用父类的 __new__,而不是它的 __init__ 方法。同时,你需要传入 self(更好的名字是 cls),因为 __new__ 是一个类方法。此外,你还需要返回结果,因为 __new__ 实际上是创建一个对象,而不是修改 self。所以:

class MonFrozenSet(frozenset):
    def __new__(cls, data):
        return super(MonFrozenSet,cls).__new__(cls, data)

然后:

>>> a = MonFrozenSet([1, 2, 3])
>>> for item in a:
...     print item
1
2
3

撰写回答