Python,子类化不可变类型

Eog*_*anM 13 python set immutability

我有以下课程:

class MySet(set):

    def __init__(self, arg=None):
        if isinstance(arg, basestring):
            arg = arg.split()
        set.__init__(self, arg)
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作(用字符串而不是字母初始化集合).但是,当我想对set的不可变版本执行相同操作时,该__init__方法似乎被忽略:

class MySet(frozenset):

    def __init__(self, arg=None):
        if isinstance(arg, basestring):
            arg = arg.split()
        frozenset.__init__(self, arg)
Run Code Online (Sandbox Code Playgroud)

我可以实现类似的东西__new__吗?

dou*_*lep 12

是的,您需要覆盖__new__特殊方法:

class MySet(frozenset):

    def __new__(cls, *args):
        if args and isinstance (args[0], basestring):
            args = (args[0].split (),) + args[1:]
        return super (MySet, cls).__new__(cls, *args)

print MySet ('foo bar baz')
Run Code Online (Sandbox Code Playgroud)

输出是:

MySet(['baz', 'foo', 'bar'])
Run Code Online (Sandbox Code Playgroud)

  • @EoghanM:不,`__new__`是不同的.基本上,`__ new__`创建*或*查找实例,而`__init__`设置已创建的实例.覆盖`__new__`的主要原因是为了避免新实例创建(例如,使`SomeType()`总是返回相同的单例对象),或者子类化某些不可变类型,如`frozenset`.有关详细信息,请参阅http://docs.python.org/reference/datamodel.html#special-method-names. (4认同)