Python: 子类化frozenset不可迭代?
子类化(也就是从一个类派生出新的类)`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