zoukankan      html  css  js  c++  java
  • __repr__与__str__

    首先我们来举个例子,定义一个长方行类Cuboid,长为x,宽为y,高为z

    class Cuboid:
    
        def __init__(self, x = 3, y = 1, z = 2):
            self.x = x
            self.y = y
            self.z = z

    默认长为3,宽为1,高为2,让我们试图打印一下这个类

    print(Cuboid())

    控制台可能会输出:

    <__main__.Cuboid object at 0x0000025EE2A9AA90>

    但是如果在类种实现__repr__或者__str__如下

    class Cuboid:
    
        def __init__(self, x = 3, y = 1, z = 2):
            self.x = x
            self.y = y
            self.z = z
    
        def __repr__(self):
            return 'Vector(%r, %r, %r)'%(self.x, self.y, self.z)
    
    print(Cuboid())

    或者

    class Cuboid:
    
        def __init__(self, x = 3, y = 1, z = 2):
            self.x = x
            self.y = y
            self.z = z
    
        def __str__(self):
            return 'Vector(%s, %s, %s)'%(self.x, self.y, self.z)
    
    print(Cuboid())

    输出结果都将是

    Vector(3, 1, 2)

    也就是说repr与str都是python的内置函数,他们能把一个对象用字符串的形式表达出来,这就是字符串表达形式。repr,str分别是通过__repr__和__str__这两个特殊方法来实现的。

    区别:

    __repr__和__str__的区别在于,后者是通过str()函数被使用,或者说是只用print打印一个对象时才会别调用。

     如果在一个对象中只想保留两者中的一个,那么最好是__repr__,因为当一个对象没有__str__,而python有需要调用它时,往往会用__repr__来替换__str__。

    更多大牛解答:

    https://stackoverflow.com/questions/1436703/difference-between-str-and-repr

    import datetime
    
    now = datetime.datetime.now()
    
    print(str(now))
    #输出
    2018-07-20 19:02:59.546306
    
    print(repr(now))
    #输出
    datetime.datetime(2018, 7, 20, 19, 2, 59, 546306)

    __repr__具有明确无误性,面向开发人员,而__str__具有可读性,面型用户。

    上面长方体类中的%r与%s也是一样

    在一些情况下

    print(It is '%s' % 7)
    print(It is '%r' % 7)
    print(It is '%d' % 7)

    三种输出是一样的

    但是下面情况

    import datetime 
    d = datetime.date.today() 
    print( "%s" % d )
    #输出
    2018-07-20 19:02:59.546306
    
    print ( "%r" % d )
    #输出
    datetime.datetime(2018, 7, 20, 19, 2, 59, 546306)

    %r打印时能够重现它所代表的对象,因此可以表达的更清楚正确。

    总结一句话就是

    __str__()魔法方法与print()输出函数搭配,并且返回值只能为一个字符串类型

    __repr__()其返回值是在交互式解释中起作用

  • 相关阅读:
    Mysql update case
    phpexcel导出excel等比例缩放图片
    phpexcel错误 You tried to set a sheet active by the out of bounds index: 1解决办法
    phpexcel操作
    Java io基础
    java线程基础
    java 集合基础(适用单线程)
    java 泛型深入
    Java反射基础
    Java泛型基础
  • 原文地址:https://www.cnblogs.com/welan/p/9343137.html
Copyright © 2011-2022 走看看