2011-02-06 20 views
147

W języku Java mogę zastąpić metodę z mojej klasy toString(). Następnie funkcja drukowania Java drukuje ciąg znaków reprezentujący obiekt zdefiniowany przez jego toString(). Czy istnieje odpowiednik Pythona dla Javy toString()?Jak zmienić reprezentację ciągów w klasie Pythona?

Na przykład mam klasę PlayCard. Mam przykład c karty PlayCard. Teraz:

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

Ale co chcę jest coś takiego:

>>> print(c) 
A♣ 

Jak dostosować znaków reprezentujący moich wystąpień klasy?

Używam Python 3.x

+0

Co to SLK? –

+0

slk jest błędem pisarskim. poprawione. – snakile

Odpowiedz

197

Najbliższy odpowiednik Java toString jest wdrożenie __str__ dla swojej klasy. Umieścić to w definicji klasy:

def __str__(self): 
    return "foo" 

Można też wdrożyć __repr__ do pomocy w debugowanie.

Zobacz tutaj po więcej informacji:

+0

Wow, to całkiem stara wersja dokumentacji;) 's/release \ /2.5.2 \ //' – delnan

+0

OP powiedział, że używa Pythona 3. Obiekt podklasy nie jest wymagany. –

+1

Dude __repr__ postanów –

25

To nie jest tak proste, jak się wydaje, niektóre funkcje biblioteczne rdzeń nie działają, gdy tylko str są nadpisywane (sprawdzane Python 2.7), zobacz ten wątek dla przykładów: How to make a class JSON serializable Wypróbuj także:

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) 

produkuje

'""' 

a nie

'"a"' 

jak można by oczekiwać.

EDIT: odpowiadając za komentarz mchicago:

unicode nie posiada żadnych atrybutów - to niezmienne łańcuch, którego wartość jest ukryta i niedostępna z wysokiego poziomu kodu Pythona. Moduł json używa re do generowania reprezentacji ciągów, która wydaje się mieć dostęp do tego wewnętrznego atrybutu.Oto prosty przykład, aby uzasadnić to:

b = A('b') print b

produkuje

'a'

podczas

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

produkuje

{"b": "b"}

, więc widzisz, że wewnętrzna reprezentacja jest używana przez niektóre biblioteki natywne, prawdopodobnie ze względu na wydajność.

Zobacz także to więcej szczegółów: http://www.laurentluce.com/posts/python-string-objects-implementation/

+2

Nie sądzę, że można by oczekiwać jakiegokolwiek wyniku "a". Serializacja Jsona nie uwzględnia funkcji, ale atrybuty i klasa A nie zawiera żadnych atrybutów, tylko trzy funkcje. Json dumps traktuje obiekt jako słownik i konwertuje wszystkie klucze do strs. – mchicago

Powiązane problemy