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

__str__,__repr__,__format__的更多相关文章

  1. python基础---- __getattribute__----__str__,__repr__,__format__----__doc__----__module__和__class__

    目录: 一. __getattribute__ 二.__str__,__repr__,__format__ 三.__doc__ 四.__module__和__class__ 一. __getattri ...

  2. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  3. python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)

    反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how  这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...

  4. 反射,内置方法,__str__ __repr__

    反射 反射用到的mmp模块 def wahaha():print('wahaha') class QQxing: def __init__(self,name): self.name = name d ...

  5. day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()

    __str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...

  6. python 中的 %s,%r,__str__,__repr__

    1.%s,%r的区别 在进行格式化输出时,%r 与 %s 的区别就好比 repr() 函数处理对象与 str() 函数处理对象的差别. %s ⇒ str(),比较智能: %r ⇒ repr(),处理较 ...

  7. __str__&__repr__

    [__str__&__repr__] object.__str__(self): Called by the str() built-in function and by the print  ...

  8. Python的程序结构[1] -> 方法/Method[4] -> 魔术方法 __call__ / __str__ / __repr__

    __call__ 方法 __call__ 是当对象被调用时会调用的方法,允许一个对象(类的实例等)像函数一样被调用,也可以传入参数. 1 class Foo(): 2 def __init__(sel ...

  9. __str__,__repr__,__add__

    class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __ ...

随机推荐

  1. Android Weekly Notes Issue #246

    Android Weekly Issue #246 February 26th, 2017 Android Weekly Issue #246 本期内容包括: RecyclerView上的Shared ...

  2. HTTP1.0 与HTTP2.0的区别

    一.多路复用 HTTP2.0 使用了多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级. 二.数据压缩 HTTP1.1不支持header数据压缩,HTTP ...

  3. flex平分测试

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. POJ 2309 BST(二叉搜索树)

    BST Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8657   Accepted: 5277 Description C ...

  5. 灵活使用rewrite

    Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向.rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外 ...

  6. git比较两个版本,获取所有代码有差别的文件,并拷贝到一个文件夹中

    git diff 3b3855d a024af5 --name-only | xargs -i cp '{}' ./update/ --parents 解释:通过xargs 命令,把git diff  ...

  7. JDBC 笔记3 通过PreparedStatement 对数据库进行增删改查 (转载)

    之前MVC时一直用它,学了框架后就没怎么用了.这里转载一位同学的博客,以后可能也会用到的. 转自:https://www.cnblogs.com/zilong882008/archive/2011/1 ...

  8. 出现”/var/lib/mysql/mysql.sock“不存在的解决方法

    这种情况大多数是因为你的mysql是使用rpm方式安装的,它会自动寻找 /var/lib/mysql/mysql.sock 这个文件,通过unix socket登录mysql.常见解决办法如下:1.创 ...

  9. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  10. 经验收获Linux终端下方便命令

    一.命令行日常系快捷键 如下的快捷方式非常有用,能够极大的提升你的工作效率: CTRL + U - 剪切光标前的内容 CTRL + K - 剪切光标至行末的内容 CTRL + Y - 粘贴 CTRL ...