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

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

  • 相关阅读:
    linux中批量添加文件前缀的操作
    Opencv中图像height width X 轴 Y轴 rows cols之间的对应关系
    PyCharm 快捷键失效解决办法
    模型权重初始化的可行性分析
    pycharm报错:Process finished with exit code -1073741819 (0xC0000005)解决办法
    损失函数———有关L1和L2正则项的理解
    利用tensorboard可视化checkpoint模型文件参数分布
    linux部署.net Core项目
    Java开发工程师2020最新面试题-适用于2-3年工作经验
    springboot常用注解
  • 原文地址:https://www.cnblogs.com/sidianok/p/11922772.html
Copyright © 2011-2022 走看看