__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传参