zoukankan      html  css  js  c++  java
  • __str__和__repr__的区别

    有时候我们想让屏幕打印的结果不是对象的内存地址,而是它的值或者其他可以自定义的东西,以便更直观地显示对象内容,可以通过在该对象的类中创建或修改__str__()__repr__()方法来实现(显示对应方法的返回值)
    注意:__str__()方法和__repr__()方法的返回值只能是字符串!

    关于调用两种方法的时机

    • 使用print()时
    • 使用%sf'{}'拼接对象时
    • 使用str(x)转换对象x时

    在上述三种场景中,会优先调用对象的__str__()方法;若没有,就调用__repr__()方法;若再没有,则显示其内存地址。

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

    • %r进行字符串拼接时
    • repr(x)转换对象x时

    则会调用这个对象的__repr__()方法;若没有,则不再看其是否有__str__()方法,而是显示其内存地址。
    Django中打印queryset时,会调用__repr__方法

    class A(object): pass
    class B(object):
        def __str__(self):
            return '1'
    class C(object):
        def __repr__(self):
            return '2'
    class D(object):
        def __str__(self):
            return '3'
        def __repr__(self):
            return '4'
    a=A()
    b=B()
    c=C()
    d=D()
    print(a,b,c,d)
    print('%s,%s,%s,%s'%(a,b,c,d))
    print('%r,%r,%r,%r'%(a,b,c,d))
    print(f'{a},{b},{c},{d}')
    print(str(a),str(b),str(c),str(d))
    print(repr(a),repr(b),repr(c),repr(d))
    ------------------------------------------------------
    <__main__.A object at 0x0000000002419630> 1 2 3
    <__main__.A object at 0x0000000002419630>,1,2,3
    <__main__.A object at 0x0000000002419630>,<__main__.B object at 0x0000000002419A58>,2,4
    <__main__.A object at 0x0000000002419630>,1,2,3
    <__main__.A object at 0x0000000002419630> 1 2 3
    <__main__.A object at 0x0000000002419630> <__main__.B object at 0x0000000002419A58> 2 4
    
  • 相关阅读:
    golang 常见疑惑总结
    golang 详解defer
    golang调试工具Delve
    ACE的源码划分
    通过#define连接字符串的特殊方法[转]
    转:extern "C"的用法解析
    转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
    转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)
    转:折腾一晚上Bullet及Ogre相关工具的成果 -- 3Ds Max,Maya, blender, GameKit
    转:CMake快速入门教程-实战
  • 原文地址:https://www.cnblogs.com/zyyhxbs/p/11184094.html
Copyright © 2011-2022 走看看