__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 __ ...
随机推荐
- ubuntu12.04出现ERROR: Removing 'hello': Device or resource busy和insmod: error inserting 'hello.ko': -1 Device or resource busy解决方案
一:insmod时候错误: 1:错误信息insmod: error inserting 'hello.ko': -1 Device or resource busy 2:原因:你的代码里面的设备号和系 ...
- POJ2115 C Looooops ——模线性方程(扩展gcd)
题目链接:http://poj.org/problem?id=2115 C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- Android工程的目录结构
1.最大限度的将不需要出现在Java代码中的文件和代码本身分离开来 2.使用XML标记语言定义UI和数据结构 3.对于工程中的文件存储在工程目录中的那个位置有着严格的规定,在编译过程中Android会 ...
- php filter 安全过滤函数
转自:http://www.blags.org/archives/741.html php 利用filter 扩展编写的参数处理静态类,欢迎使用.希望大家看得开心,用得放心. <?php /** ...
- Python: PS 滤镜--表面模糊
本文用 Python 实现 PS 滤镜中的表面模糊,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/528 ...
- Preface Numbering
链接 分析:先打表需要用到的罗马数字,然后暴力转换,最后统计一下即可 /* PROB:preface ID:wanghan LANG:C++ */ #include "iostream&qu ...
- flask logger
Flask uses standard Python logging. All Flask-related messages are logged under the 'flask' logger n ...
- Alien Flowers
题意: 求含有A个"RR",B个"RB",C个"BB",D个"BR"的字符串个数. 解法: 首先考虑"BR&q ...
- Flutter实战视频-移动电商-17.首页_楼层组件的编写技巧
17.首页_楼层组件的编写技巧 博客地址: https://jspang.com/post/FlutterShop.html#toc-b50 楼层的效果: 标题 stlessW快速生成: 接收一个St ...
- 3-6局部变量的存储方式 & 3-7字符型字面值
基础数据类型变量的存储 重点介绍方法级的变量,局势局部变量 存储中怎么存储呢? int n=100; 在栈中开辟内存存储空间. n是内存空间的别名 3-7字符型字面值 单引号不能丢,必须是英文状态. ...