zoukankan      html  css  js  c++  java
  • python笔记70 Python中`__repr__`和`__str__`区别 上海

    前言

    Python中__repr____str__使用区别

    __repr__ 使用

    很多时候我们在创建一个类的时候,在终端打印类的实例,看到的是一个类似于这样的内容:<XXX object at 0x0000000001222E10>

    class MyDefined(object):
    
        def __init__(self):
            self.name = "yoyo"
    

    在终端调试结果

    >python
    Python 3.6.6
    >>> from a import MyDefined
    >>> yo=MyDefined()
    >>> yo
    <a.MyDefined object at 0x0000015EEEB1F0B8>
    >>>
    

    返回的是对象的内存地址,对于初学者看起来很不友善,初学者无法理解返回的内容,于是可以加一个__repr__ 方法

    class MyDefined(object):
    
        def __init__(self):
            self.name = "yoyo"
    
        def __repr__(self):
            return '<object MyDefined: {}>'.format(self.name)
    

    重新在终端调试

    >python
    Python 3.6.6 
    >>> from a import MyDefined
    >>> yo=MyDefined()
    >>> yo
    <object MyDefined: yoyo>
    >>> print(yo)
    <object MyDefined: yoyo>
    

    从打印的结果就可以看到返回的是<object MyDefined: yoyo>,这样用户就知道返回的是什么实例对象,便于开发者理解。
    __repr__是直接输出对象(面向开发者),方便提供接口给开发者使用,如django里面的ORM查询,返回queryset对象。

    __str__ 使用

    __str__方法是在print()打印的时候输出给用户看的,面向的是普通的用户,方便用户知道返回的是什么实例对象。

    class MyDefined(object):
    
        def __init__(self):
            self.name = "yoyo"
    
        def __str__(self):
            return '<object MyDefined: {}>'.format(self.name)
    

    在终端调试

    >python
    Python 3.6.6 
    >>> from a import MyDefined
    >>> yo=MyDefined()
    >>> yo
    <a.MyDefined object at 0x000001A4C133F128>
    >>> print(yo)
    <object MyDefined: yoyo>
    >>>
    

    从结果可以看到直接输入yo,返回的还是object at 0x000,只有print()输出的时候才会打印__str__返回的内容

    总结

    注意:__str__()方法和__repr__()方法的返回值只能是字符串!
    __repr____str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向开发者

    关于调用两种方法的时机

    • 使用print()时
    • 使用%s和f'{}'拼接对象时
    • 使用str(x)转换对象x时
      在上述三种场景中,会优先调用对象的__str__()方法;若没有,就调用__repr__()方法;若再没有,则显示其内存地址。

    特别地,对于下面两种场景:

    • 用%r进行字符串拼接时
    • 用repr(x)转换对象x时
      则会调用这个对象的__repr__()方法;若没有,则不再看其是否有__str__()方法,而是显示其内存地址。

    当我们想在不同环境下支持不同的显示,例如终端用户显示使用__str__,而程序员在开发期间则使用底层的__repr__来显示,实际上__str__只是覆盖了__repr__以得到更友好的用户显示。

    参考博客https://www.cnblogs.com/zyyhxbs/p/11184094.html
    参考博客https://blog.csdn.net/nanhuaibeian/article/details/86694581

  • 相关阅读:
    lambda 是个啥玩意
    python中读写操作plist
    通过os中的os.path.basename获取路径中的文件名
    python遍历目录的两种方法
    mac下已有pyhon2.7,装了python3 之后,怎么调用python3啊
    Python: easy_install & pip 下载PyPi 公共资源库的工具
    安装python的图形处理库: pillow
    minSdkVersion, targetSdkVersion, targetApiLevel,compileSdkVersion,buildToolsVersion
    bat 批量修改文件名字
    a b两向量叉乘 <0说明a在b左边
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/15588104.html
Copyright © 2011-2022 走看看