Как изменить строковое представление класса 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/