【发布时间】:2011-03-08 10:14:34
【问题描述】:
我有以下课程:
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__ 实现类似的效果吗?
【问题讨论】:
-
我认为
__new__(..)在雕刻不可变类型的实例时采取主动的原因是利用不可变性并保留返回现有实例(如果可用)的机会。 (但如果一个人不想要这种优势,那么他们可以在不与__new__(..)混淆的情况下创建一个不可变类型。特别是,__new__(..)不提供任何特殊上下文。仍然需要通过@987654328 修改不可变字段@ 或类似名称,无论是在__new__(..)还是__init_(..)内。)
标签: python set immutability