__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__,这样的话,你如果觉的直接输出对象信息多的话,那加工下,或者通过另外方式输出对象的信息。

 

收笔,这样至少我自己搞的清清楚楚了。

 

 

posted @ 2019-11-24 16:02  就是想学习  阅读(236)  评论(0编辑  收藏  举报