Python,子类化不可变类型
我有一个这样的类:
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'])