Ответ 1
Использование метода factory является обычным способом его решения, тем более, что создание экземпляра класса неотличимо от вызова функции в Python.
Однако, если вы действительно этого хотите, вы можете назначить self.__class__
:
THRESHOLD = 1000
class Small(object):
def __init__(self, n):
if n < THRESHOLD:
self.n = n
else:
self.__class__ = Big
self.__init__(n)
class Big(object):
def __init__(self, n):
if n < THRESHOLD:
self.__class__ = Small
self.__init__(n)
else:
self.n = n
Это работает как ожидалось:
>>> a = Small(100)
>>> type(a)
<class 'Small'>
>>> b = Small(1234)
>>> type(b)
<class 'Big'>
>>> c = Big(2)
>>> type(c)
<class 'Small'>
Если присваивание self.__class__
кажется слишком странным, тогда вместо этого вы можете переопределить __new__
. Этот метод вызывается до вызова __init__
и его можно использовать для выбора класса для создания экземпляра:
THRESHOLD = 1000
class Switcher(object):
def __new__(cls, n):
if n < THRESHOLD:
new_cls = Small
else:
new_cls = Big
instance = super(Switcher, new_cls).__new__(new_cls, n)
if new_cls != cls:
instance.__init__(n)
return instance
class Small(Switcher):
def __init__(self, n):
self.n = n
class Big(Switcher):
def __init__(self, n):
self.n = n