鱼C论坛

 找回密码
 立即注册
查看: 924|回复: 11

关于使用__str__和__repr__的问题

[复制链接]
发表于 2018-7-28 22:57:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wxfnb 于 2018-7-29 10:55 编辑

如图,整个运行过程中都没有调用过str函数过,另外repr在运行过程中有什么用,好像也没有用到,但是代码删了运行就出问题了,另外为什么__repr__ 不定义成def __repr__ (self):呢?__repr__ = __str__这行代码又是什么意思
  1. import time as t

  2. class My:
  3.     def __init__(self):
  4.         self.unit = ['年', '月', '天', '小时', '分钟', '秒']
  5.         self.prompt = "未开始计时!"
  6.         self.lasted = []
  7.         self.begin = 0
  8.         self.end = 0
  9.    
  10.     def __str__(self):
  11.         return self.prompt

  12.     __repr__ = __str__

  13.     def __add__(self, other):
  14.         prompt = "总共运行了"
  15.         result = []
  16.         for index in range(6):
  17.             result.append(self.lasted[index] + other.lasted[index])
  18.             if result[index]:
  19.                 prompt += (str(result[index]) + self.unit[index])
  20.         return prompt
  21.    
  22.     # 开始计时
  23.     def start(self):
  24.         self.begin = t.localtime()
  25.         self.prompt = "提示:请先调用 stop() 停止计时!"
  26.         print("计时开始...")

  27.     # 停止计时
  28.     def stop(self):
  29.         if not self.begin:
  30.             print("提示:请先调用 start() 进行计时!")
  31.         else:
  32.             self.end = t.localtime()
  33.             self._calc()
  34.             print("计时结束!")

  35.     # 内部方法,计算运行时间
  36.     def _calc(self):
  37.         self.lasted = []
  38.         self.prompt = "总共运行了"
  39.         for index in range(6):
  40.             self.lasted.append(self.end[index] - self.begin[index])
  41.             if self.lasted[index]:
  42.                 self.prompt += (str(self.lasted[index]) + self.unit[index])
  43.         # 为下一轮计时初始化变量
  44.         self.begin = 0
  45.         self.end = 0
复制代码
1231321321321.JPG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-28 23:00:26 | 显示全部楼层
  1. >>> c = My()
  2. >>> print(c) #调用__str__
  3. 未开始计时!
  4. >>> c #调用_repr__
  5. 未开始计时!
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-28 23:32:49 | 显示全部楼层
print() 是针对字符串

__repr__ 或 repr() 是针对对象。一般来说是在 debug 的时候才用。如果你要删掉,那么把 self.prompt = ... 都改为 print("...")

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

使用道具 举报

发表于 2018-7-29 09:23:29 | 显示全部楼层
两个方法都是通过对象的输入,提出返回值的请求。不同之处在于,__str__的返回需要结合print(对象),而repr则直接输入对象就行了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-29 10:59:09 | 显示全部楼层

为什么__repr__ 不定义成def __repr__ (self):呢?__repr__ = __str__这行代码又是什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 11:54:17 | 显示全部楼层
wxfnb 发表于 2018-7-29 10:59
为什么__repr__ 不定义成def __repr__ (self):呢?__repr__ = __str__这行代码又是什么意思

就是把__str__的对象赋值给__repr__(就是说,它们两个赋值之后都是同一个函数了)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-29 12:12:36 | 显示全部楼层
无符号整形 发表于 2018-7-29 11:54
就是把__str__的对象赋值给__repr__(就是说,它们两个赋值之后都是同一个函数了)。


__repr__ = __str__
1、那这个__repr__ 算是变量还是函数
2、在calss里面,def里面的函数除了init,其他函数要调用才会运行吗,__init__是初始化自动运行一次吗
3、
  1. class My:
  2.     def __init__(self):
  3.            xxxxxxxxxxxxxxxxxxx
  4.     __repr__ = __str__
复制代码

这个repr与def的格式齐平,就是说不需要手动调用,只要用到这个class My,就会和init一样自动运行吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 12:15:20 | 显示全部楼层
wxfnb 发表于 2018-7-29 12:12
__repr__ = __str__
1、那这个__repr__ 算是变量还是函数
2、在calss里面,def里面的函数除了init,其 ...

1.__repr__算是函数
2.不是,比如__add__(执行加法时运行),__sub__(执行减法时运行),是初始化时运行一次。(注意,没有不调用就执行的函数)
3.不是,__str__只会在print的时候执行,返回一个字符串,print就会打印出这个字符串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-29 12:20:15 | 显示全部楼层
无符号整形 发表于 2018-7-29 12:15
1.__repr__算是函数
2.不是,比如__add__(执行加法时运行),__sub__(执行减法时运行),是初始化时运 ...

第二个问题还是没看懂,“是初始化时运行一次”,是什么意思
第三个问题是__repr__。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 13:29:16 | 显示全部楼层
wxfnb 发表于 2018-7-29 12:20
第二个问题还是没看懂,“是初始化时运行一次”,是什么意思
第三个问题是__repr__。。。

我的意思是__init__是初始化运行一次,另外__repr__在直接在shell里面输入变量时显示的字符串(不好意思,看错了。。。)
比如:
  1. >>> class test:
  2.         def __repr__(self):
  3.                 return 'hi!'

  4.        
  5. >>> t=test()
  6. >>> t
  7. hi!
  8. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-29 13:36:11 | 显示全部楼层
无符号整形 发表于 2018-7-29 13:29
我的意思是__init__是初始化运行一次,另外__repr__在直接在shell里面输入变量时显示的字符串(不好意思 ...

那我把篮圈里面的__str__改为
def __repr__(self):
      return self.prompt
然后把红圈删了,这样好像更简单。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-29 13:38:25 | 显示全部楼层
wxfnb 发表于 2018-7-29 13:36
那我把篮圈里面的__str__改为
def __repr__(self):
      return self.prompt

这样也行,这不过__repr__ = __str__更加简洁。
__repr__ = __str__的话__repr__和__str__就是同一个函数了,只不过它们名字不同。
另外你可以看看这个:http://bbs.fishc.org/thread-118923-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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