__format__

__format__

  • 自定义格式化字符串

1.format( ) 函数

前面已经介绍过了format( ) 函数的玩法, 下面简单回顾一下

# 直接传变量名
msg = "my name is {name} my age is {age}".format(age=18, name="淘小欣")
print(msg)  # my name is 淘小欣 my age is 18# 不放任何值 ,让其按位置自动传值
msg = "my name is {} my age is {}".format(18, "淘小欣")
print(msg)  # my name is 18 my age is 淘小欣# 通过索引传值
msg = "my name is {0}{0}{0} my age is {1}{0}".format(18, "jack")
print(msg)  # my name is 181818 my age is jack18

2.__format__ 方法

  • 其实我们使用format( ) 函数的时候触发的就是 __format__ 方法

    class For:
        def __format__(self, format_spec):
            print(type(format_spec))  # 查看这个参数是什么类型
            print(f"使用format()函数,触发了我-->({format_spec})")
            return "2021,加油~~"  # 必须返回一个字符串(不然报错),可以是任意的字符串(后面可以使用此特性来操作自定义)
    ​
    ​
    F = For()
    # 当第二个参数不传人时默认为空
    format(F)
    """输出
    <class 'str'>
    使用format()函数,触发了我-->()
    """# 传参类型 "str"
    format(F, "2021,初次见面,请多多关照~~")
    """输出
    <class 'str'>
    使用format()函数,触发了我-->(2021,初次见面,请多多关照~~)
    """
    

应用实例

  • 制作一个输出日期类, 实例的时候传入年,月,日, 可以自定义格式

    class Date:
        __format_dic = {
            "1": "{obj.year}-{obj.mon}-{obj.day}",
            "2": "{obj.year}:{obj.mon}:{obj.day}",
            "3": "{obj.year}/{obj.mon}/{obj.day}"
        }
    ​
        def __init__(self, Year, Mon, Day):
            self.year = Year
            self.mon = Mon
            self.day = Day
    ​
        def __format__(self, format_spec):
            if not format_spec or not format_spec in self.__format_dic:  # 如果格式编号为空或者不在自定义字典里面
                f = self.__format_dic["1"]  # 那我们就给一个默认的格式
            else:
                f = self.__format_dic[format_spec]  # 否则就使用你传入的格式
            return f.format(obj=self)  # 使用 "obj=self" 赋值的方法避免递归调用
    ​
    ​
    mm = Date(2020, 1, 1)
    print(format(mm, "1"))  # 2020-1-1
    print(format(mm, "2"))  # 2020:1:1
    print(format(mm, "3"))  # 2020/1/1
    print(format(mm, ))  # 2020-1-1 (空, 选择默认)
    print(format(mm, "3iop"))  # 2020-1-1 (不存在, 选择默认)