是否有任何標準約定在python中打印對象?我知道,如果我只是試圖打印對象,它會打印內存地址,但我想覆蓋該方法,並能夠打印對象的人類可讀格式以幫助進行調試。約定在python中打印對象
是否有任何標準約定的人遵循或不是一個好方法來定義這樣的方法,而是有更好的選擇?
是否有任何標準約定在python中打印對象?我知道,如果我只是試圖打印對象,它會打印內存地址,但我想覆蓋該方法,並能夠打印對象的人類可讀格式以幫助進行調試。約定在python中打印對象
是否有任何標準約定的人遵循或不是一個好方法來定義這樣的方法,而是有更好的選擇?
您可以覆蓋__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
在您正在打印的對象的類中實現函數__str__
。
如果要打印一個類的對象,你不能改變則是相當簡單的提供你自己的print
功能,因爲你使用Python 3
編輯:通常情況下,通過字符串返回__str__
會對於班級來說是特定的,但至少要足以識別對象。字符串的確切格式取決於類和公共屬性。
EDIT2:下面是來自一類描述國家的簡單(切開)例如:
def __str__(self):
return "{0:<32} {1:>010}".
format(self.__name, self.__population)
的標準方法來打印一個對象(類的實例)的定製信息是使用__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
如果你的對象可以在一個方式,讓娛樂來表示,則覆蓋__repr__
函數。例如,如果你可以創建一個具有以下代碼的對象:
MyObject('foo', 45)
的的__repr__
應返回"MyObject('foo', 45)"
。然後您不需要執行__str__
。
但是,如果對象太複雜以致於無法像這樣表示,請改爲使用__str__
。然後你應該返回一些東西,它們都表明對象不能被重新創建,並且它是一個對象。因此,請不要返回"foo:45"
,因爲它看起來像一個字符串或{'foo': 45}
,因爲它看起來像一本字典,在調試時會讓你感到困惑。
我建議你保留括號,例如<MyObject foo:45>
。這樣,顯然你已經打印了一個對象,並且很明顯,這不僅僅是編寫MyObject('foo', 45)
來重新創建對象的問題,而且還有更多的數據存儲。
我認爲這個問題更多的是關於用什麼*格式*來實現'__str__'。 – 2012-11-05 09:12:11
@Tichodroma;啊,我誤解了。 – cdarke
其實我很想知道如何覆蓋和覆蓋什麼。 – raju