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

最新文章

  1. gem安装cocoapods
  2. 彻底卸载Visual Studio 2013、Visual Studio 2015
  3. checkbox的check事件
  4. C#四种深拷贝方法
  5. java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)
  6. .net 文件下载【转】
  7. LPC43xx SGPIO DMA and Interrupts
  8. Resharper 8.0 的最实用的功能
  9. asp.net ToString()方法介绍
  10. 17-UIKit(UIView的动画)
  11. How to pause the game in Uniy3D
  12. css 为元素选择器,css目标状态伪类,结构化选择器,多媒体选择器,清除表默认样式、属性选择器
  13. 手把手教你打造一个心电图效果View Android自定义View
  14. [ionic3.x开发记录]ios下页面过渡效果不出现的小坑
  15. flutter mac 下安装
  16. 你使用的ie版本过低请。。。
  17. C++ 指针常量和常量指针
  18. Python学习笔记(三)——条件语句、循环语句
  19. datetime24小时格式和12小时格式
  20. 如何利用JS判断当前来路域名并跳转到指定页面

热门文章

  1. 第三篇:python基础之数据类型与变量
  2. hdu 1711 Number Sequence(kmp找子串第一次出现的位置)
  3. Linux下抓包工具tcpdump应用详解
  4. python 基础之第八天--字典相关
  5. C++之构造函数、参数列表、析构函数
  6. c++之拷贝构造函数详解
  7. 文件的打开函数第一类--fopen()
  8. HDU2190
  9. 免证书发布ipa文件真机测试
  10. 改变bootstrapSwitch按钮状态