__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 (不存在, 选择默认)