У меня есть следующий класс:
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__
?
Да, вам нужно переопределить специальный метод __ 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'])