__str__、__repr__和__format__
2024-09-03 07:07:18
- obj.__ str __ ()是面向用户的,该方法将实例转换为一个字符
- obj.__ repr __ ()面向程序员,该方法返回一个实例的代码表示形式,通常用来重新构造这个实例,repr()函数返回的字符串,和我们使用交互式显示的值是一样的,__ repr __ ()生成的文本字符串标准做法是需要让eval(repr(x)) == x为真
- obj.__ format __:自定制格式化字符串
- __str__和__repr__区别与联系:
- 上述两个方法返回值必须是字符串,否则抛出异常;
- 这两个方法都是自定义类的字符串描述,但是两个的调用机制不同:
- 使用str函数或者print函数会调用__str__;
- 使用repr函数或者交互式解释器时会调用__repr__;如果__str__没有被定义,那么就会使用__repr__来代替输出;当我们查看对象的时候会调用repr;列表以及字典等容器总是会使用 repr 方法。即使你显式的调用 str 方法,也是如此
>>> class Animal():
def __init__(self, name):
self.name = name
def __str__(self):
return '__str__ Animal'
def __repr__(self):
return '__repr__ Animal'
>>>
>>> animal = Animal('cat')
>>> animal
__repr__ Animal
>>> repr(animal)
'__repr__ Animal'
>>> str(animal)
'__str__ Animal'
>>> print(animal)
__str__ Animal
>>> str([animal])
'[__repr__ Animal]'
那么__str__和__repr__到底有什么不同呢?
>>> from datetime import datetime
>>> today = datetime.now()
>>> today
datetime.datetime(2019, 8, 2, 13, 38, 54, 71000)
>>> print(today)
2019-08-02 13:38:54.071000
观察上面的结果我们可以看出
__str__的结果可读性更强,__str__是面向用户的,因此返回的信息更清晰容易理解;
__repr__的结果更精确和详细,__repr__是面向程序员的,它存在的目的是为了调试,便于开发者使用。
class Animal():
def __str__(self):
return 'print时调用该方法'
obj = Animal()
print(obj)
format_dict={
'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
class School:
def __init__(self,name,addr,type):
self.name=name
self.addr=addr
self.type=type
def __repr__(self):
return 'School(%s,%s)' %(self.name,self.addr)
def __str__(self):
return '(%s,%s)' %(self.name,self.addr)
def __format__(self, format_spec):
# if format_spec
if not format_spec or format_spec not in format_dict:
format_spec='nat'
fmt=format_dict[format_spec]
return fmt.format(obj=self)
s1=School('Hogwarts','FL','magic')
print('from repr: ',repr(s1))
print('from str: ',str(s1))
print(s1)
print(format(s1,'nat'))
print(format(s1,'tna'))
print(format(s1,'tan'))
print(format(s1,'asfdasdffd'))
最新文章
- oracle--第一天PLSQL--bai
- NuGet安装及使用教程
- 自定义不等高cell—storyBoard或xib自定义不等高cell
- linux脚本编程技术---8
- 初步掌握Yarn的架构及原理
- JAVA中的正则表达式--待续
- WSImport
- TCP的三次握手和四次挥手(转)
- hdu-4419-Colourful Rectangle-段树区,并寻求
- maven和libgdx
- Oracle中如何插入特殊字符:&; 和 ' (多种解决方案)-转载
- SQL Server学习之路(六):“增删改查”之“查”
- 《深入理解Bootstrap》读书笔记(一)
- Python利用pandas处理Excel数据的应用
- oldboy es和logstash
- sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法
- Visual Studio 中使用万能头文件 #include <;bits/stdc++.h>;
- query
- python更新tomcat脚本
- [c#]记一次实验室局域网的ARP欺骗