2011-02-06 4 views
147

В Java я могу переопределить метод toString() моего класса. Затем функция печати Java печатает строковое представление объекта, определенного его toString(). Есть ли эквивалент Python для Java toString()?Как изменить строковое представление класса Python?

Например, у меня есть класс PlayCard. У меня есть экземпляр c из PlayCard. Сейчас:

>>> print(c) 
<__main__.Card object at 0x01FD5D30> 

Но то, что я хочу что-то вроде:

>>> print(c) 
A♣ 

Как настроить строковое представление моих экземпляров классов?

Я использую Python 3.x

+0

Что это SLK? –

+0

slk - ошибка ввода. исправленный. – snakile

ответ

197

Ближайший эквивалент в Java toString является реализация __str__ для вашего класса. Поместите это в определении класса:

def __str__(self): 
    return "foo" 

Вы также можете реализовать __repr__, чтобы помочь в отладке.

Смотрите здесь для получения дополнительной информации:

+0

Ничего себе, это довольно старая версия документов;) 's/release \ /2.5.2 \ //' – delnan

+0

OP сказал, что он использует python 3. Объект подкласса не требуется. –

+1

Dude __repr__ resolve –

25

Это не так просто, как кажется, некоторые функции ядра библиотеки не работают, когда только ул переписывается (проверено с Python 2.7), см. Эту резьбу для примеров How to make a class JSON serializable Кроме того, попробуйте это

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 в:

Юникода не имеет каких-либо атрибутов - это непреложный строка, значение которой скрыт и не доступен из кода Python высокого уровня. Модуль json использует re для генерации строкового представления, которое, похоже, имеет доступ к этому внутреннему атрибуту.Вот простой пример, чтобы оправдать это:

b = A('b') print b

производит

'a'

в то время как

json.dumps({'b': b})

производит

{"b": "b"}

так что вы видите, что внутреннее представление используется некоторыми родными библиотеками, возможно, по соображениям производительности.

Смотрите также это для более подробной информации: http://www.laurentluce.com/posts/python-string-objects-implementation/

+2

Я не думаю, что ожидается какой-либо вывод 'a'. Сериализация Json не рассматривает функции, но атрибуты и класс A не содержат никаких атрибутов, а всего три функции. Json dumps рассматривает объект как словарь и преобразует все ключи в strs. – mchicago

Смежные вопросы