继承set和frozenset的行为似乎有所不同
有人可以解释以下行为:
class derivedset1(frozenset):
def __new__(cls,*args):
return frozenset.__new__(cls,args)
class derivedset2(set):
def __new__(cls,*args):
return set.__new__(cls,args)
a=derivedset1('item1','item2') # WORKS
b=derivedset2('item1','item2') # DOESN'T WORK
Traceback (most recent call last):
File "inheriting-behaviours.py", line 12, in <module>
b=derivedset2('item1','item2') # DOESN'T WORK
TypeError: derivedset2 expected at most 1 arguments, got 2
这让我很惊讶,你可以改变一个冻结集的构造函数,而不可能为一个可变集的构造函数。
从Python文档:
如果__new__()
返回一个cls
实例,那么将调用新实例的__init__
()方法,如__init__(self[, ...])
,其中self
是新实例,其余参数与传递给__new__()
。
set.__init__
只需要一个参数,一个指定初始设置内容的迭代器。 因此,您应该添加您自己的初始化程序,它将采用所有附加参数并将它们作为初始设置值提供:
class derivedset2(set):
def __new__(cls,*args):
return set.__new__(cls,*args)
def __init__(self, *initial_values):
set.__init__(self, initial_values)
注意你应该覆盖__init__
并且不要实现__new__
除非你想实现对象缓存,单例或者类似的奇怪东西。 你的子类适用于frozenset
正是因为frozenset
确实利润对象缓存,即Python解释器只需要一个frozenset
两个实例frozenset
具有相同内容的对象。
一般来说,您应该避免对内置类进行子类别derivedset2([])
,尤其是在语义不兼容的情况下(在这种情况下, set([])
和derivedset2([])
返回完全不同的结果)。
上一篇: Inheriting behaviours for set and frozenset seem to differ
下一篇: Will const parameters and typecasting work as before under Delphi 64bit?