代码之家  ›  专栏  ›  技术社区  ›  EoghanM

python,不可变类型的子类化

  •  12
  • EoghanM  · 技术社区  · 16 年前

    我有以下课程:

    class MySet(set):
    
        def __init__(self, arg=None):
            if isinstance(arg, basestring):
                arg = arg.split()
            set.__init__(self, arg)
    

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

    class MySet(frozenset):
    
        def __init__(self, arg=None):
            if isinstance(arg, basestring):
                arg = arg.split()
            frozenset.__init__(self, arg)
    

    我能做些类似的事吗 __new__ ?

    1 回复  |  直到 16 年前
        1
  •  12
  •   doublep    16 年前

    是的,您需要重写 __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')
    

    输出为:

    MySet(['baz', 'foo', 'bar'])