Ваш подкласс str
не переопределяет format
, поэтому, когда вы вызываете format
в одном из его экземпляров, он просто использует тот, унаследованный от str
, который использует внутреннее значение self
как str
", т. Е. Строковая форма того, что вы передали offset()
.
Чтобы изменить это внутреннее значение, вы можете переопределить __new__
, например ::
class offset(str):
def __init__(self, x):
self.x = x
def __new__(cls, x):
return str.__new__(cls, '{' + str(int(bool(x))) + '}')
for i in (0, 1):
x = offset(i)
print x
print repr(x)
print x.format('first', 'next')
излучает
{0}
'{0}'
first
{1}
'{1}'
next
Обратите внимание, что нет необходимости также переопределять __repr__
, если, переопределив __new__
, вы уже гарантируете, что внутреннее значение экземпляра как str
- это формат, который вы хотите.