Печать Python не использует __repr__
, __unicode__
или __str__
для моего юникодного подкласса при печати. Какие-нибудь подсказки относительно того, что я делаю неправильно?
Вот мой код:
Использование Python 2.5.2 (r252: 60911, 13 октября 2009, 14:11:59)
>>> class MyUni(unicode):
... def __repr__(self):
... return "__repr__"
... def __unicode__(self):
... return unicode("__unicode__")
... def __str__(self):
... return str("__str__")
...
>>> s = MyUni("HI")
>>> s
'__repr__'
>>> print s
'HI'
Я не уверен, что это точная аппроксимация вышеизложенного, но только для сравнения:
>>> class MyUni(object):
... def __new__(cls, s):
... return super(MyUni, cls).__new__(cls)
... def __repr__(self):
... return "__repr__"
... def __unicode__(self):
... return unicode("__unicode__")
... def __str__(self):
... return str("__str__")
...
>>> s = MyUni("HI")
>>> s
'__repr__'
>>> print s
'__str__'
[РЕДАКТИРОВАНИЕ...] Это звучит как лучший способ получить строковый объект, который isstance (экземпляр, basestring) и предлагает контроль над возвращаемыми значениями unicode, а с помощью unicode repr...
>>> class UserUnicode(str):
... def __repr__(self):
... return "u'%s'" % super(UserUnicode, self).__str__()
... def __str__(self):
... return super(UserUnicode, self).__str__()
... def __unicode__(self):
... return unicode(super(UserUnicode, self).__str__())
...
>>> s = UserUnicode("HI")
>>> s
u'HI'
>>> print s
'HI'
>>> len(s)
2
_str _ и _repr _ не добавляют ничего к этому примеру, но идея состоит в том, чтобы явно показать шаблон, который должен быть расширен по мере необходимости.
Просто чтобы доказать, что этот шаблон предоставляет управление:
>>> class UserUnicode(str):
... def __repr__(self):
... return "u'%s'" % "__repr__"
... def __str__(self):
... return "__str__"
... def __unicode__(self):
... return unicode("__unicode__")
...
>>> s = UserUnicode("HI")
>>> s
u'__repr__'
>>> print s
'__str__'
Мысли?