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