類的自定義格式
注意:
以下所有內容均適用於
str.format
方法以及format
函式。在下面的文字中,兩者是可以互換的。
對於傳遞給 format
函式的每個值,Python 都會為該引數查詢 __format__
方法。因此,你自己的自定義類可以擁有自己的 __format__
方法來確定 format
函式將如何顯示和格式化你的類及其屬性。
這與 __str__
方法不同,因為在 __format__
方法中,你可以考慮格式化語言,包括對齊,欄位寬度等,甚至(如果你願意)實現你自己的格式說明符,以及你自己的格式化語言擴充套件。 1
object.__format__(self, format_spec)
例如 :
# Example in Python 2 - but can be easily applied to Python 3
class Example(object):
def __init__(self,a,b,c):
self.a, self.b, self.c = a,b,c
def __format__(self, format_spec):
""" Implement special semantics for the 's' format specifier """
# Reject anything that isn't an s
if format_spec[-1] != 's':
raise ValueError('{} format specifier not understood for this object', format_spec[:-1])
# Output in this example will be (<a>,<b>,<c>)
raw = "(" + ",".join([str(self.a), str(self.b), str(self.c)]) + ")"
# Honor the format language by using the inbuilt string format
# Since we know the original format_spec ends in an 's'
# we can take advantage of the str.format method with a
# string argument we constructed above
return "{r:{f}}".format( r=raw, f=format_spec )
inst = Example(1,2,3)
print "{0:>20s}".format( inst )
# out : (1,2,3)
# Note how the right align and field width of 20 has been honored.
注意:
如果你的自定義類沒有自定義
__format__
方法並且該類的例項被傳遞給format
函式,則 Python2 將始終使用__str__
方法或__repr__
方法的返回值來確定要列印的內容(如果兩者都不存在則將使用預設repr
),你將需要使用s
格式說明符來格式化它。使用 Python3 ,要將自定義類傳遞給format
函式,你需要在自定義類上定義__format__
方法。