鱼C论坛

 找回密码
 立即注册
查看: 1885|回复: 17

[已解决]__str__与__repr__的区别是什么

[复制链接]
发表于 2022-3-5 14:22:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. class A:
  2.     def __str__(self):
  3.         return "ji是帅哥"

  4. class B:
  5.     def __repr__(self):
  6.         return "ji是帅哥!"


  7. b = B()
  8. b
  9. print(b)

  10. a = A()
  11. print(a)
复制代码
最佳答案
2022-3-6 14:24:31
不弃_ 发表于 2022-3-5 17:03
所亿方法的区别在哪里呢?

这么说吧,字符串中__str__ 返回的字符串是转义后的,且不带引号的,只是给你看的,在 python 代码中不能直接使用,

而字符串的 __repr__ 返回的字符串是转义前的,且带引号的字面量,可以直接在 python 代码中使用,

而对于其它对象 __repr__ 和 __str__ 的返回值并无区别。所以你并不用纠结这个。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-5 14:30:22 | 显示全部楼层
__str__ 魔法方法是会在访问其类对象时就会自动执行,
所以只需要:
  1. a = A()
  2. a
  3. 返回结果:
  4. "ji是帅哥"
复制代码

而 __repr__ 魔法方法是会在对这个类生成的实例对象进行打印操作时就会自动执行,
所以只需要:
  1. b = B()
  2. print(b)
  3. 返回结果:
  4. "ji是帅哥"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-5 14:34:35 | 显示全部楼层
  1. >>> class A:
  2.     def __str__(self):
  3.         return "ji是帅哥"

  4. >>> class B:
  5.     def __repr__(self):
  6.         return "ji是帅哥!"

  7. >>> a=A()
  8. >>> b=B()
  9. >>> a
  10. <__main__.A object at 0x01793810>
  11. >>> b
  12. ji是帅哥!
  13. >>>
复制代码

评分

参与人数 1鱼币 +5 收起 理由
python爱好者. + 5 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-3-5 14:35:32 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 14:37:49 | 显示全部楼层

      差不多,抄网!

评分

参与人数 1鱼币 +5 收起 理由
python爱好者. + 5 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 14:39:06 | 显示全部楼层
jackz007 发表于 2022-3-5 14:37
差不多,抄网!

就改了下格式。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-5 15:18:04 | 显示全部楼层
python爱好者. 发表于 2022-3-5 14:30
__str__ 魔法方法是会在访问其类对象时就会自动执行,
所以只需要:

为什么我的a与b不调用print就不会返回那
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 15:22:02 | 显示全部楼层
  1. """
  2. The repr() function returns the string representation of the value passed to eval function by default.
  3. For the custom class object, it returns a string enclosed in angle brackets that contains the name and address of the object by default.
  4. """

  5. # 范例:

  6. class A: pass # 类
  7. B = lambda x: x*x*x # 函数
  8. x = 123 # 整数
  9. y = "456" # 字符串

  10. a = str(x) # 将整数变成字符串
  11. b = repr(x) # 以字符串形式,返回对象 x,如上,无差别
  12. c = repr(y) # 以字符串形式,返回字符串(如:字符串 repr("banana") = "\'banana\'")
  13. d = repr(A) # 以字符串形式,返回对象类型
  14. e = repr(B) # 以字符串形式,返回内存地址
  15. f = eval(y) # 去引号

  16. print(a, b, c, d, e, f, sep = "\n")
  17. print()
  18. print(type(a), type(b), type(b), type(d), type(e), type(f), sep = "\n")
复制代码
  1. 123
  2. 123
  3. '456'
  4. <class '__main__.A'>
  5. <function <lambda> at 0x0000023145BC3E20>
  6. 456

  7. <class 'str'>
  8. <class 'str'>
  9. <class 'str'>
  10. <class 'str'>
  11. <class 'str'>
  12. <class 'int'>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 15:26:11 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-3-5 16:23 编辑

repr(): 其实是 evaluatable string representation of an object 的缩写。意思是对象的可评估字符串表示

评分

参与人数 1鱼币 +1 收起 理由
不弃_ + 1 不好意思,看不懂

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 15:29:01 | 显示全部楼层
本帖最后由 isdkz 于 2022-3-5 15:35 编辑
不弃_ 发表于 2022-3-5 15:18
为什么我的a与b不调用print就不会返回那


__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str__ 方法,

而在控制台直接访问这个变量或者使用repr() 实际上调用了 对象的 __repr__方法

print() 你可以通过格式化字符串改变输出方式:

  1. class A:
  2.     def __str__(self):
  3.         return "ji是帅哥"
  4.     def __repr__(self):
  5.         return "ji是美女"


  6. a = A()

  7. print(a)
  8. print("%s" % a)    # 相当于 print(a)
  9. print("输出原始字符串:%r" % a)    # 输出原始字符串
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-5 17:03:03 | 显示全部楼层
isdkz 发表于 2022-3-5 15:29
__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str ...

所亿方法的区别在哪里呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 17:34:21 | 显示全部楼层
__str__返回的结果是在print的时候出现的
__repr__返回的结果是在交互模式下出现的

评分

参与人数 1鱼币 +1 收起 理由
不弃_ + 1 嗯,谢了

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 17:34:52 | 显示全部楼层
isdkz 发表于 2022-3-5 15:29
__str__ 和 __repr__ 都是返回字符串,

在用 print() 和 str() 的时候 实际上调用的是 对象的 __str ...

hi,猫咪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-5 18:46:07 | 显示全部楼层
简单的说,一个给机器看,一个给人看

评分

参与人数 1鱼币 +1 收起 理由
不弃_ + 1 不错

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 14:24:31 | 显示全部楼层    本楼为最佳答案   
不弃_ 发表于 2022-3-5 17:03
所亿方法的区别在哪里呢?

这么说吧,字符串中__str__ 返回的字符串是转义后的,且不带引号的,只是给你看的,在 python 代码中不能直接使用,

而字符串的 __repr__ 返回的字符串是转义前的,且带引号的字面量,可以直接在 python 代码中使用,

而对于其它对象 __repr__ 和 __str__ 的返回值并无区别。所以你并不用纠结这个。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 14:25:03 | 显示全部楼层

hi,kfc
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-6 14:27:24 | 显示全部楼层
isdkz 发表于 2022-3-6 14:24
这么说吧,字符串中__str__ 返回的字符串是转义后的,且不带引号的,只是给你看的,在 python 代码中不能 ...

谢了兄弟
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-6 14:29:18 | 显示全部楼层

不客气
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 05:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表