四. __format__

四. __format__

自定义格式化字符串

1.format( ) 函数

前面 字符串类型的内置方法 已经详细的介绍了 format( ) 函数的玩法, 下面简单回顾一下

🍉直接传变量名
res="my name is {name} my age is {age}".format(age=18,name="shawn")
print(res)  #my name is shawn my age is 18

🍉不放任何值, 让其按位置自动传值
res="my name is {} my age is {}".format(18,"shawn")
print(res)  #my name is 18 my age is shawn

🍉通过索引传值
res="my name is {0}{0}{0} my age is {1}{0}".format(18,"shawn")
print(res)  #my name is 181818 my age is shawn18

2.__format__ 方法

  • 其实我们使用format( ) 函数的时候触发的就是 __format__ 方法
class For:
    def __format__(self, format_spec):
        print(type(format_spec))  # 看看这个参数是什么类型
        print(f"使用format()函数,触发了我-->({format_spec})")
        return "aaa"   # 必须返回一个字符串(不然报错),可以是任意的字符串(后面可以使用此特性来操作自定义)

F = For()

🔰当第二个参数不传入时默认为空
format(F)
'''输出
<class 'str'>
使用format()函数,触发了我-->()
'''
🔰传参类型 "str"
format(F,"你好")
'''输出
<class 'str'>
使用format()函数,触发了我-->(你好)

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

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,12,28)

print(format(mm,"1"))     # 2020-12-28
print(format(mm,"2"))     # 2020:12:28
print(format(mm,"3"))     # 2020/12/28
print(format(mm,))        # 2020-12-28 (空, 选择默认)
print(format(mm,"3iop"))  # 2020-12-28 (不存在, 选择默认)

posted @ 2020-12-30 12:24  给你骨质唱疏松  阅读(159)  评论(0)    收藏  举报