類的自定義格式

注意:

以下所有內容均適用於 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__ 方法。