• __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}',
        'ymd':'{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传参
  • 相关阅读:
    发布镜像
    实战Tomcat镜像
    Docker File介绍
    数据卷容器
    DockerFile
    具名、匿名、指定路径挂载
    实战MySQL
    SHELL 常用技巧
    CentOS6和7启动流程
    解决服务器openssh漏洞
  • 原文地址:https://www.cnblogs.com/shangpolu/p/6232950.html
Copyright © 2020-2023  润新知