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

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

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

  1. print(Cuboid())

控制台可能会输出:

  1. <__main__.Cuboid object at 0x0000025EE2A9AA90>

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

  1. class Cuboid:
  2.  
  3. def __init__(self, x = 3, y = 1, z = 2):
  4. self.x = x
  5. self.y = y
  6. self.z = z
  7.  
  8. def __repr__(self):
  9. return 'Vector(%r, %r, %r)'%(self.x, self.y, self.z)
  10.  
  11. print(Cuboid())

或者

  1. class Cuboid:
  2.  
  3. def __init__(self, x = 3, y = 1, z = 2):
  4. self.x = x
  5. self.y = y
  6. self.z = z
  7.  
  8. def __str__(self):
  9. return 'Vector(%s, %s, %s)'%(self.x, self.y, self.z)
  10.  
  11. print(Cuboid())

输出结果都将是

  1. 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

  1. import datetime
  2.  
  3. now = datetime.datetime.now()
  4.  
  5. print(str(now))
  6. #输出
  7. 2018-07-20 19:02:59.546306
  8.  
  9. print(repr(now))
  10. #输出
  11. datetime.datetime(2018, 7, 20, 19, 2, 59, 546306)

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

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

在一些情况下

  1. print(It is '%s' % 7)
  2. print(It is '%r' % 7)
  3. print(It is '%d' % 7)

三种输出是一样的

但是下面情况

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

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

总结一句话就是

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

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

__repr__与__str__的更多相关文章

  1. [转]Python中__repr__和__str__区别

    class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Te ...

  2. Python中__repr__和__str__区别

    Python中__repr__和__str__区别 看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): ...

  3. raindi python魔法函数(一)之__repr__与__str__

    __repr__和__str__都是python中的特殊方法,都是用来输出实例对象的,如果没有定义这两个方法在打印的时候只会输出实例所在的内存地址 这种方式的输出没有可读性,并不能直观的体现实例.py ...

  4. Python中__repr__和__str__区别(转)

    class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Te ...

  5. Python面试题之Python中__repr__和__str__区别

    看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): self.data = value >> ...

  6. Python3中__repr__和__str__区别

    示例: class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t ...

  7. class类 __repr__ 与__str__

    >>> class Student(object):... def __init__(self, name):... self.name = name... def __str__( ...

  8. python中的 __repr__和__str__

    __repr__,被内置函数repr用于把一个对象用"官方"的字符串形式表示出来(终端友好)    1.值传给eval()来返回一个对象的字符串表示形式    2.否则返回一个尖括 ...

  9. Python中的魔法函数__repr__和__str__的实质性区别

    str 和 repr 方法:是自定义类的字符串描述,这两种都是比较 Pythonic 的方式去控制对象转化为字符串的方式. 调用这两个方法,返回的都是字符串.但是这两个方法又有一些区别 ** 1 两种 ...

随机推荐

  1. file_put_contents 换行

    file_put_contents('test.text', json_encode($result) . PHP_EOL, FILE_APPEND);

  2. Nodejs的模块系统

    global对象 浏览器端JavaScript中的全局对象为"window",在浏览器中定义的变量都会成为"window"对象的属性. 不像浏览器端JavaSc ...

  3. WIN10安装scrapy/channels等不成功的解决方式

    问题 在Win10机器上,不管是安装scrapy还是channels,都需要安装一个包,叫做twisted.正是这个twisted,导致出现一系列的奇葩错误,让我一度以为我的Pycharm坏了,还改了 ...

  4. odoo开发笔记 -- 权限机制

    转两篇关于权限的2篇文章,加深这方面的认识.注:后面附有原作者地址,希望不构成侵权. https://www.cnblogs.com/crazyguo/p/6999408.html 第一篇:http: ...

  5. FireFox浏览器-xpath快速定位插件:Xpath Checker

    FireFox浏览器-xpath快速定位插件:Xpath Checker 插件截图:

  6. 没啥事用C语言写一个Trie tree玩玩,支持中英文,用g++编译通过

    #include <cstdio> #include <cstdlib> #include <vector> #define ALPHABETS 2600000 # ...

  7. 剑指offer十四之链表中倒数第k个结点

    一.题目 输入一个链表,输出该链表中倒数第k个结点. 二.思路 两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点.然后两个指针同时往后移动,当第一个结 ...

  8. Jdbc Url 设置allowMultiQueries为true和false时底层处理机制研究

    一个mysql jdbc待解之谜 关于jdbc  url参数 allowMultiQueries 如下的一个普通JDBC示例: String user ="root"; Strin ...

  9. 在Hadoop 2.3上运行C++程序各种疑难杂症(Hadoop Pipes选择、错误集锦、Hadoop2.3编译等)

    首记 感觉Hadoop是一个坑,打着大数据最佳解决方案的旗帜到处坑害良民.记得以前看过一篇文章,说1TB以下的数据就不要用Hadoop了,体现不 出太大的优势,有时候反而会成为累赘.因此Hadoop的 ...

  10. 28-hadoop-hbase入门小程序

    hbase的完全分布式建立起来了, 可以试下好使不 1, 导包, {HBASE_HOME}/lib 下所有的jar包, 导入 2, 使用junit测试, 会报错, 因为缺少一个jar 3, 获取链接, ...