Python类的自定义格式

示例

注意:

以下所有内容均适用于该str.format方法以及该format功能。在下面的文本中,两者是可以互换的。

对于传递给format函数的每个值,Python都会__format__为该参数寻找一个方法。因此,您自己的自定义类可以具有自己的__format__方法来确定format函数如何显示和格式化您的类及其属性。

这与__str__方法不同,因为在该__format__方法中,您可以考虑格式语言,包括对齐方式,字段宽度等,甚至(如果您愿意)实现自己的格式说明符和自己的格式语言扩展名。1

object.__format__(self, format_spec)

例如 :

# Python 2中的示例-但可以轻松应用于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 """
        # 拒绝任何不是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)]) + ")"
        # 通过使用内置的字符串格式来遵循格式语言
        # 由于我们知道原始的format_spec以's'结尾 
        # 我们可以将str.format方法与 
        # 我们在上面构造的字符串参数
        return "{r:{f}}".format( r=raw, f=format_spec )

inst = Example(1,2,3)
print "{0:>20s}".format( inst )
# 出:(1,2,3)
# 请注意右对齐和20的字段宽度是如何兑现的。

注意:

如果您的自定义类不具有自定义__format__方法和类的实例传递给format函数,Python2将始终使用的返回值__str__的方法或__repr__方法来确定要打印的内容(如果既不存在,那么默认repr将使用),则需要使用s格式说明符对此格式进行格式化。使用Python3时,要将自定义类传递给format函数,您将需要__format__在自定义类上定义方法。