Python魔法方法(7):__format __(self, format_spec) 方法

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__方法,把原本固定的格式化的逻辑做成了可配置的。这样大大增加了使用过程当中的灵活性,这种灵活性在一些问题场景当中可以大大简化和简洁代码。

猜你喜欢

转载自blog.csdn.net/youzhouliu/article/details/125275862