内置方法 str-repr
一、平时我们获取打印一个对象的时候,我们打印的是它的地址,如果我们想知道其中具体的值必须一个一个对象.属性调取,
如何去用某种东西去一次性打印出我们所需要的呢?如下,我们有两种方法
优先级:__str__ > __repr__
__str__方法在一个类的内部的定义,跟在外部的调用,如下
class A(object): def __init__(self,name,age): self.name = name self.age = age def __str__(self) #如果不实现str方法打印出来的是对象的地址 return f'{self.name}{self.age}' person = A('alex',123)
#调用方式(触发str): #1. print(person) #打印触发 #2. print(f'{python}') #格式化触发
class A(object): def __init__(self,name,age): self.name = name self.age = age # def __repr__(self): # return f'{self.name},{self.age}' def __str__(self): return f'{self.name},{self.age}' alex = A('alex',23) print(alex) print(f'{alex}') print(repr(alex)) print('%r'%alex)
# 如果str存在,repr也存在
# 那么print(obj)和使用字符串格式化format,%s这两种方式 调用的都是__str__
# 而repr(obj)和%r格式化字符串,都会调用__repr__
# 如果str不存在,repr存在
# 那么print(obj),字符串格式化format,%s,%r 和repr(obj)都调用__repr__
# 如果str存在,repr不存在
# 那么print(obj)和使用字符串格式化format,%s这两种方式 调用的都是__str__
# repr(obj)和%r格式化字符串 都会打印出内存地址
综上所述,我们还是用repr好,你说呢?
class A(object): def __init__(self,name,price,period): self.name = name self.price = price self.period = period def __repr__(self): return f'{self.name},{self.price},{self.period}' def __str__(self): return f'---{self.name},{self.price},{self.period}' class B(A): def __repr__(self): return f'{self.name}---{self.price}---{self.period}' def __str__(self): return f'{self.name}?{self.price}?{self.period}' # pass py20 = B('alex',100,2) print(py20)
注意:打印的时候先找自己的str,如果没有找父类的str,如果父类也没有就找自己的repr,如果自己也没repr,就找父类的repr
# 有了repr或者str在打印对象的时候 就不会显示用户不关心的内存地址了
# 增强了用户的体验 在程序开发的过程中
# 如果我们需要频繁打印对象中的属性,需要从类的外部做复杂的拼接,实际上是一种麻烦
# 如果这个拼接工作在类的内部已经完成了,打印对象的时候直接就能显示