Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,它们是面向对象的 Python 的一切。它们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了某一个魔法方法,那么这个方法就会在特殊的情况下自动被 Python 所调用。
功能
定义对象被format()函数调用时的行为,常用于字符串的格式化输出。
参数
self代表一个对象;format_spec表示格式控制符(可自定义),它将接收’:‘后面的字符串(如’{0: string}’.format(object) ,会将字符串’string’传给format_spec)
返回值
必须是一个字符串,否则抛出异常。
示例
date_dic = {
'ymd': '{0.year}:{0.month}:{0.day}',
'dmy': '{0.day}/{0.month}/{0.year}',
'mdy': '{0.month}-{0.day}-{0.year}',
}
class MyText:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def __format__(self, format_spec):
if not format_spec or format_spec not in date_dic:
format_spec = 'ymd'
fmt = date_dic[format_spec]
return fmt.format(self)
d1 = MyText(2019, 9, 17)
# 2019: 9:17
print('{0:ymd}'.format(d1))
执行结果:
2019:9:17
可以在类当中重载__format__函数,这样就可以在外部直接通过format函数来调用对象,输出想要的结果。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return 'x: %s, y: %s' % (self.x, self.y)
def __format__(self, code):
return 'x: {x}, y: {y}'.format(x=self.x, y=self.y)
p = Point(3, 5)
print(f'this point is {p}')
执行结果:
this point is x: 3, y: 5
通过重载__format__方法,把原本固定的格式化的逻辑做成了可配置的。这样大大增加了使用过程当中的灵活性,这种灵活性在一些问题场景当中可以大大简化和简洁代码。