Python,子类化不可变类型

15 投票
1 回答
3504 浏览
提问于 2025-04-16 00:26

我有一个这样的类:

class MySet(set):

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

这个类的工作方式是正常的(它用字符串中的单词来初始化集合,而不是字母)。但是,当我想用不可变集合的版本做同样的事情时,__init__ 方法似乎没有被执行:

class MySet(frozenset):

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

我可以用 __new__ 来实现类似的功能吗?

1 个回答

14

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

撰写回答