__repr__与__str__的大叔小白说明记录。
学Python一段时间了,以前对题目两个函数一直看不懂,网上资料基本五花八门,复制粘贴为主,讲的能看懂的我是没找到。
以下申明,这是结合《深入了解Python特性》的书中知识,出于自己的理解写下的博客,禁止转载。
首先__repr__与__str__明显是两个不同的方法,是完全不同的方法,一般在定义对象的时候,假如没有定义__str__的方法,在需要使用__str__的时候就会使用__repr__
这个解释很明显的告诉你,定义类的时候,最坏的情况下面,如果一定要写一个对象返回说明,还是写__repr__里面。
首先上一个只有__str__的情况:
class Car: def __init__(self, color, mileage): self.color = color self.mileage = mileage # def __repr__(self): # return f'Car({self.color !r}, {self.mileage !r})' def __str__(self): return f'a {self.color} car' car = Car('red',8888) print(car) a red car str(car) 'a red car' f'{car}' 'a red car' car <__main__.Car object at 0x10587d450>
在里面很明显,终端屏幕使用,只要需要用到字符串输出的时候,都会调用__str__方法,但在终端中输入实例却还是返回了对象的信息,这也许就是所谓网上一大抄袭的说对终端的程序员不友好的地方。
下面,再来一个只有__repr__的
class Car: def __init__(self, color, mileage): self.color = color self.mileage = mileage def __repr__(self): return f'Car({self.color !r}, {self.mileage !r})' # def __str__(self): # return f'a {self.color} car' car = Car('red',8888) car Car('red', 8888) print(car) Car('red', 8888) f'{car}' "Car('red', 8888)"
在这里面可以看到__repr__基本实现了__str__的所有输出需求,而且终端输入实例,能调用__repr__方法。
最后,试着把两个一起用会如何,先试验一个datatime的模块实例对象输出。
import datetime tt = datetime.datetime.now() # 实例化对象 tt datetime.datetime(2019, 11, 24, 15, 54, 3, 889942) print(tt) 2019-11-24 15:54:03.889942
从输出来看,tt直接输出的信息更加全面告诉你了具体什么模块信息(面向程序员),print输出对于终端用户更加友好(面向用户)。
最后自己的列子,把两个模块都写上了。
class Car: def __init__(self, color, mileage): self.color = color self.mileage = mileage def __repr__(self): return f'Car({self.color !r}, {self.mileage !r})' def __str__(self): return f'a {self.color} car' car = Car('red',123) car Car('red', 123) repr(car) "Car('red', 123)" print(car) a red car f'{car}' 'a red car'
从代码中可以看到,用__repr__的只要终端输入实例名称或者调用repr的函数才返回。所以后续的工作中,如果需要用到面向客户输出,需要把__repr__与__str__都写上__str__可以写简单一点。
如果懒的话,就直接写一个__repr__,这样的话,你如果觉的直接输出对象信息多的话,那加工下,或者通过另外方式输出对象的信息。
收笔,这样至少我自己搞的清清楚楚了。