1、前言
class People:
def __init__(self,name,sex):
self.name = name
self.sex = sex
p = People('xiaoming','male')
'''
In:p
OutPut:<__main__.People at 0x7fddfeif>
In:print(p)
OutPut:<__main__.People at 0x7fddfeif>
'''
- 两种方式显示出来的信息都是对象所属类的名称以及对象所在的地址。
- 通过重写__str__和__repr__方法来定制我们想要的信息。
2、str&repr方法
str和repr方法,是自定义类的字符串描述,当我们打印或查看某个对象时,最终看到的结果就是这两个方法的返回值。
2.1、重写str方法
class A:
def __str__(self):
return '__str__'
a = A()
'''
In:a
OutPut:<__main__.People at 0x7fddfeif>
In:print(a)
OutPut:__str__
'''
直接输入对象再回车,返回的结果与原来一样;但是打印打印对象时,触发了__str__方法。
2.2、重写__repr__
class B:
def __repr__(self):
return '__repr__'
b = B()
'''
In:b
OutPut:__repr__
In:print(b)
OutPut:__repr__
'''
直接输入b和通过print打印都是调用了__repr__方法。
2.3、重写__str__&__repr__方法
class C:
def __str__(self):
return '__str__'
def __repr__(self):
return '__repr__'
c = C()
'''
In:c
OutPut:__repr__
In:print(c)
OutPut:__str__
'''
- 交互模式下,直接输入对象c,调用的是__repr__方法
- 打印对象的时候,直接调用如果有__str__方法,则直接调用__str__方法,如果没有则调用__repr__方法,如果两个方法都没有,则正常打印类的内存地址信息。
3、总结
- __str__是一个对象的非正式的、易于阅读的字符串描述,当类str实例化(str(object))时会被调用,以及会被内置函数format()和print()调用;
- __repr__是一个对象的官方字符串描述,会被内置函数repr()方法调用,它的描述必须是信息丰富和明确的。也就是说__str__返回的结果可读性强,__repr__返回的结果更加准确。
import datetime
d = datetime.datetime.now()
In: str(d)
OutPut: '2019-08-24 08:12:17.942242' # 可读性强
In: repr(d)
OutPut: 'datetime.datetime(2019, 8, 24, 8, 12, 17, 942242)' # 信息更加丰富和准确