Как изменить строковое представление класса Python?
В Java я могу переопределить метод toString()
моего класса. Затем функция печати Java печатает строковое представление объекта, определенного его toString()
. Есть ли эквивалент Python для Java toString()
?
Например, у меня есть класс PlayCard. У меня есть экземпляр c из PlayCard. Сейчас:
>>> print(c)
<__main__.Card object at 0x01FD5D30>
Но я хочу что-то вроде:
>>> print(c)
A♣
Как настроить строковое представление экземпляров моего класса?
Я использую Python 3.x
Ответы
Ответ 1
Ближайшим эквивалентом Java toString
является реализация __str__
для вашего класса. Поместите это в определение вашего класса:
def __str__(self):
return "foo"
Вы также можете реализовать __repr__
, чтобы помочь в отладке.
См. здесь дополнительную информацию:
Ответ 2
Это не так просто, как кажется, некоторые основные функции библиотеки не работают, когда перезаписывается только str (проверяется с помощью Python 2.7), см. этот поток для примеров
Как сделать класс JSON сериализуемым
Кроме того, попробуйте это
import json
class A(unicode):
def __str__(self):
return 'a'
def __unicode__(self):
return u'a'
def __repr__(self):
return 'a'
a = A()
json.dumps(a)
производит
'""'
а не
'"a"'
как и следовало ожидать.
EDIT: ответ на комментарий mchicago:
unicode не имеет никаких атрибутов - это неизменяемая строка, значение которой скрыто и недоступно из высокоуровневого кода Python. Модуль json
использует re
для генерации строкового представления, которое, похоже, имеет доступ к этому внутреннему атрибуту. Вот простой пример, чтобы оправдать это:
b = A('b')
print b
производит
'a'
а
json.dumps({'b': b})
производит
{"b": "b"}
поэтому вы видите, что внутреннее представление используется некоторыми родными библиотеками, возможно, по соображениям производительности.
См. также более подробно: http://www.laurentluce.com/posts/python-string-objects-implementation/