注意:
以下所有内容均适用于该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__在自定义类上定义方法。