__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 @ 2016-12-29 14:44  总要做些什么  阅读(272)  评论(0编辑  收藏  举报