【发布时间】:2020-02-12 15:10:52
【问题描述】:
你好,我正在上课
class multiset(dict):
def __new__(cls,iterabile):
d = dict()
for i in iterabile:
if i not in d.keys():
d[i] = iterabile.count(i)
return super().__new__(cls,d)
这个类是一个自定义字典,它从输入列表中创建一个字典,其中键是元素,值是列表中键元素的出现次数。 问题是 super().__new__(cls,d) 返回这个错误:
Traceback(最近一次调用最后一次):
文件“”,第 1 行,在 m = 多集([1,1,1,2,1,3,2,3])
TypeError: 无法将字典更新序列元素 #0 转换为序列
【问题讨论】:
-
不确定最佳解决方案,但问题是
dict.__init__被原始列表调用super().__new__创建对象。 -
您可以覆盖
__init__并确保使用适当的元素调用super().__init__,但最好不要使用新语义覆盖__new__。dict.__new__接受一个可迭代的参数,但它应该是一个可迭代的键/值对。 -
可能最好的办法就是不要子类
dict;多重集不是dict的一种,尽管您可以使用dict实现多重集。 -
@chepner 它也不适用于键/值对,我尝试了 super().__new__(cls,d.items())
-
__new__不关心字典并忽略它。如果您覆盖__init__并且只使用相同的参数调用super().__init__,您将看到错误来自__init__,而不是__new__。
标签: python dictionary