类的自定义格式

注意:

以下所有内容均适用于 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__ 方法。