__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传参
__str__,__repr__,__format__的更多相关文章
- python基础---- __getattribute__----__str__,__repr__,__format__----__doc__----__module__和__class__
目录: 一. __getattribute__ 二.__str__,__repr__,__format__ 三.__doc__ 四.__module__和__class__ 一. __getattri ...
- python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法
一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...
- python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)
反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how 这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...
- 反射,内置方法,__str__ __repr__
反射 反射用到的mmp模块 def wahaha():print('wahaha') class QQxing: def __init__(self,name): self.name = name d ...
- day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()
__str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...
- python 中的 %s,%r,__str__,__repr__
1.%s,%r的区别 在进行格式化输出时,%r 与 %s 的区别就好比 repr() 函数处理对象与 str() 函数处理对象的差别. %s ⇒ str(),比较智能: %r ⇒ repr(),处理较 ...
- __str__&__repr__
[__str__&__repr__] object.__str__(self): Called by the str() built-in function and by the print ...
- Python的程序结构[1] -> 方法/Method[4] -> 魔术方法 __call__ / __str__ / __repr__
__call__ 方法 __call__ 是当对象被调用时会调用的方法,允许一个对象(类的实例等)像函数一样被调用,也可以传入参数. 1 class Foo(): 2 def __init__(sel ...
- __str__,__repr__,__add__
class School: def __init__(self,name,addr,type): self.name=name self.addr=addr self.type=type def __ ...
随机推荐
- php设计模式之单例模式实例(设计mysqli连接数据的数据处理类)
一直在研究php的设计模式,但是没有亲历使用过,所以还是一知半解,通过几天的学习终于对php的单例设计模式稍稍的有些了解,特此写出一个数据库处理类(只涉及到简单的原理),以便自己以后方便查阅,至于其他 ...
- SPOJ7258
传送门 这题可以参考平衡树求第k大的过程,需要预处理一下从当前节点往下走能走出多少个子串. 原本准备存个图用反向的topsort,发现极为麻烦,看了别人的代码后发现,他们按step大小用了基排,省了很 ...
- dhcpcd守护进程分析【转】
本文转载自;http://blog.csdn.net/lishanmin11/article/details/37930073 最近在调android ethernet功能,android本身不带 e ...
- Codeforces Round #369 (Div. 2) D. Directed Roads —— DFS找环 + 快速幂
题目链接:http://codeforces.com/problemset/problem/711/D D. Directed Roads time limit per test 2 seconds ...
- 小trick之mklink
因为要看很多论文就下载安装了zotero,又因为文献库的文件夹在安装目录太深,找起来太麻烦,再加上是软件本身的安装目录,因此把论文都下载在默认文件中总会天然地产生不安全感,万一误删软件怎么办.所以在文 ...
- ubuntu166.04之Caffe安装
写在前面:之前一直在搞keras,最近由于某些需求,需要学习caffe,在此记录caffe的安装记录.默认已经安装了cuda 如果是从其他的深度学习平台迁移到Caffe,那么按照这个教程来就可以了. ...
- PowerDesigner 连接 MySQL 并生成逆向工程图
1 配置环境变量 Tools → General Options → Variables 配置 JVM 变量 General Options 在最后,要一直往下拉才会看到. 注意: PowerDe ...
- C++之构造函数、参数列表、析构函数
参考自:https://blog.csdn.net/sunSHINEEzy/article/details/78122485 构造函数之默认构造函数(调用的构造函数不用传递参数) 两种实例化方式都是默 ...
- android性能测试工具
Android性能测试工具Emmagee介绍 Emmagee介绍 Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具.该工具的优势在于如同windows系 ...
- Redis GEO 特性在 LBS 中的应用总结
什么是LBS LBS(Location Based Service),基于位置的服务. Redis和GEO Redis 是最热门的 nosql 数据库之一,它的最大特点就是快.所以在 LBS 这种需要 ...