2012-11-05 86 views
4

是否有任何標準約定在python中打印對象?我知道,如果我只是試圖打印對象,它會打印內存地址,但我想覆蓋該方法,並能夠打印對象的人類可讀格式以幫助進行調試。約定在python中打印對象

是否有任何標準約定的人遵循或不是一個好方法來定義這樣的方法,而是有更好的選擇?

回答

7

您可以覆蓋__str____repr__函數。

關於如何實現__str__函數沒有約定;它可以返回你想要的任何可讀的字符串表示。然而,關於如何實現__repr__函數有一個約定:它應該返回對象的字符串表示,以便可以從該表示(如果可能)重新創建該對象,即eval(repr(obj)) == obj

假設你有一個類Point__str____repr__可以這樣實現:

class Point: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 
    def __str__(self): 
     return "(%.2f, %.2f)" % (self.x, self.y) 
    def __repr__(self): 
     return "Point(x=%r, y=%r)" % (self.x, self.y) 
    def __eq__(self, other): 
     return isinstance(other, Point) and self.x == other.x and self.y == other.y 

例子:

>>> p = Point(0.1234, 5.6789) 
>>> str(p) 
'(0.12, 5.68)' 
>>> "The point is %s" % p # this will call str 
'The point is (0.12, 5.68)' 
>>> repr(p) 
'Point(x=0.1234, y=5.6789)' 
>>> p # echoing p in the interactive shell calls repr internally 
Point(x=0.1234, y=5.6789) 
>>> eval(repr(p)) # this echos the repr of the new point created by eval 
Point(x=0.1234, y=5.6789) 
>>> type(eval(repr(p))) 
<class '__main__.Point'> 
>>> eval(repr(p)) == p 
True 
5

在您正在打印的對象的類中實現函數__str__

如果要打印一個類的對象,你不能改變則是相當簡單的提供你自己的print功能,因爲你使用Python 3

編輯:通常情況下,通過字符串返回__str__會對於班級來說是特定的,但至少要足以識別對象。字符串的確切格式取決於類和公共屬性。

EDIT2:下面是來自一類描述國家的簡單(切開)例如:

def __str__(self): 
    return "{0:<32} {1:>010}". 
     format(self.__name, self.__population) 
+1

我認爲這個問題更多的是關於用什麼*格式*來實現'__str__'。 – 2012-11-05 09:12:11

+0

@Tichodroma;啊,我誤解了。 – cdarke

+0

其實我很想知道如何覆蓋和覆蓋什麼。 – raju

1

的標準方法來打印一個對象(類的實例)的定製信息是使用__str__方法:

class A: 
    var = 1 

    def __str__(self): 
     return 'Accessing from print function, var = {0}'.format(self.var) 

在這種方法中,你可以顯示任何信息,你想

a = A() 
print(a) 
>>> Accessing from print function, var = 1 
+0

...以及2.7。 – glglgl

+0

不,它不。 print是2.x – alexvassel

+3

中的一個語句......它完全接受'(a)'作爲要打印的表達式。 – glglgl

3

如果你的對象可以在一個方式,讓娛樂來表示,則覆蓋__repr__函數。例如,如果你可以創建一個具有以下代碼的對象:

MyObject('foo', 45) 

的的__repr__應返回"MyObject('foo', 45)"。然後您不需要執行__str__

但是,如果對象太複雜以致於無法像這樣表示,請改爲使用__str__。然後你應該返回一些東西,它們都表明對象不能被重新創建,並且它是一個對象。因此,請不要返回"foo:45",因爲它看起來像一個字符串或{'foo': 45},因爲它看起來像一本字典,在調試時會讓你感到困惑。

我建議你保留括號,例如<MyObject foo:45>。這樣,顯然你已經打印了一個對象,並且很明顯,這不僅僅是編寫MyObject('foo', 45)來重新創建對象的問題,而且還有更多的數據存儲。