__str__,__repr__,__format__

__str__,__repr__

__str__:控制返回值,并且返回值必须是str类型,否则报错

__repr__:控制返回值并且返回值必须是str类型,否则报错

__repr__是__str__的替代品,如果str存在,直接按str的返回值,返回信息,不会执行repr,如果不存在,会执行repr,并得到repr的返回值

复制代码
class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    # def __str__(self):      #返回值必须是字符串
    #     return 'str--->名字是%s 年龄是%s'%(self.name,self.age)

    def __repr__(self):     #返回值必须是字符串
        return 'repr--->名字是%s 年龄是%s' % (self.name, self.age)

f1 = Foo('zhaok',18)
print(f1)   #系统:原本打印应该是一个<__main__.Foo object at 0x000000131E2CE6D8> 对象
            #自己定义__str__后,返回的是自己定义的返回值  名字是zhaok 年龄是18
            #print(f1)--> str(f1) ---> f1.__str__()     解析过程
'''
f1.name = 'zhaok' #做的就是往属性字典里添加或覆盖值,原理:--->setattr----->f1.__dict__['name'] = 'egon'
f1['name'] = 'zhaok'                                    --->setitem----->f1.__dict__['name'] = 'egon'
两个方法的底层都是一样的,只不过通过setattr,setitem中转了一下
str函数--->obj.__str__()
repr函数--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
'''
复制代码

__format__

'字符串%s'.format('字符串拼接')

print('{0}{0}{0}'.format('aaa'))
执行结果: aaaaaaaaa

很low的办法实现字符串格式化

不太智能,不能根据用户输入的格式,进行返回信息

复制代码
#这样实现太low
class Date:
    def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    def __format__(self, format_spec):
        print('__format__执行')
        print('------->',format_spec)   #format_spec默认为空,可不传
        ymd = '{0.year}-{0.month}-{0.day}'.format(d1)
        ymd1 = '{0.year}:{0.month}:{0.day}'.format(d1)
        ymd2 = '{0.year}\{0.month}\{0.day}'.format(d1)
        return 'ymd:%s|ymd1:%s|ymd2:%s'%(ymd,ymd1,ymd2)

d1 = Date(2016,12,26)   #实例化一个对象d1
print(format(d1)) #format(d1)或d1.__format__()  #触发调用函数,d1传给self,format_spec默认为空,可不传
复制代码

来个智能的

想法:定义字典,根据k取值,拿到v信息赋值操作

复制代码
format_dic={
    'y-m-d':'{0.year}-{0.month}-{0.day}',
    'y:m:d':'{0.year}:{0.month}:{0.day}',
    'y\m\d':'{0.year}\{0.month}\{0.day}'
}
class Date:
    def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    def __format__(self, format_spec):      #format_spec默认为空值,现在接收用户输入的格式
        print('__format__执行')
        #print('------->',format_spec)
        if not format_spec or format_spec not in format_dic:    #判断用户输入是否为空或格式是否在format_dic字典中存在
            format_spec = 'ymd'                  #如果为空,或不在字典,给个默认值
        else:
            fm = format_dic[format_spec]        #如果在字典中,取到相应的格式,赋值给fm
        return fm.format(self)                  #最后根据情况返回一个拼接好的格式信息

d1 = Date(2016,12,26)    #实例化一个对象d1
print(format(d1,'y:m:d')) #d1.__format__()  #触发调用函数,d1传给self,用到format_spec传参
复制代码

 

posted @   总要做些什么  阅读(280)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
点击右上角即可分享
微信分享提示