2011-02-06 83 views
147

在Java中,我可以覆蓋我的課程的toString()方法。然後Java的打印功能打印由其toString()定義的對象的字符串表示。有沒有相當於Java的toString()的Python?如何更改Python類的字符串表示形式?

例如,我有一個PlayCard類。我有一個PlayCard實例c。現在:

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

但我想是這樣的:

>>> print(c) 
A♣ 

如何自定義我的類實例的字符串表示?

我使用Python 3.x的

+0

什麼是slk? – 2011-02-06 11:01:47

+0

slk是一個打字錯誤。糾正。 – snakile 2011-02-06 11:04:20

回答

197

最接近等同於Java的toString是實施__str__爲你的類。把這個類定義:

def __str__(self): 
    return "foo" 

你也可能要實現__repr__來幫助調試。

在這裏看到更多的信息:

+0

哇,這是一個漂亮的老版本的文檔;)`s/release \ /2.5.2 \ //` – delnan 2011-02-06 11:00:56

25

這並不像看起來那麼容易,當只有STR被覆蓋一些核心庫的功能不工作(檢查與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"' 

正如所預期的。

編輯:回答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/

相關問題