Извините, что пришли на вечеринку с опозданием на 8,5 лет.
Вы можете получить из неизменяемого (например, Int). Вы не можете определить __init__
, потому что неизменяемый объект уже создан и не может быть изменен (по определению). Здесь пригодится __new__
.
class IntContainer(int):
def __new__ (cls, val):
ival = int.__new__(cls, val)
ival._rval = 'IntContainer(%d)' % ival
return ival
def __repr__ (self):
return self._rval
In [1]: i = IntContainer(3)
In [2]: i
Out[2]: IntContainer(3)
In [3]: repr(i)
Out[3]: 'IntContainer(3)'
In [4]: str(i)
Out[4]: '3'
In [5]: i + 5
Out[5]: 8
In [6]: 4 + i
Out[6]: 7
In [7]: int(i)
Out[7]: 3
In [8]: float(i)
Out[8]: 3.0
Теперь ответим на ваш вопрос об операторах конвертации. Вы также можете определить __int__
, __long__
, __float__
и, очевидно, __str__
. Чтобы преобразовать или привести к произвольному объекту, вам, скорее всего, потребуется изменить другой объект, чтобы получить то, что вы хотите. Вы можете использовать метод __new__
этого другого объекта. Или, если другой объект уже создан, попробуйте использовать __call__
.