继承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([])返回完全不同的结果)。

链接地址: http://www.djcxy.com/p/50457.html

上一篇: Inheriting behaviours for set and frozenset seem to differ

下一篇: Will const parameters and typecasting work as before under Delphi 64bit?