鱼C论坛

 找回密码
 立即注册
查看: 1934|回复: 10

[已解决]请问__str__函数的调用问题

[复制链接]
发表于 2020-7-13 21:40:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Twilight6 于 2020-7-13 21:42 编辑

代码如下:
import time as t
class Mytimer():
    def __str__(self):
        return self.prompt
    __repr__=__str__
    def begin(self):
        self.start=t.localtime()
        print("现在开始计时")
    def end(self):
       self.stop=t.localtime()
       self.calc()
       print("计时结束")
    def calc(self):
        self.lasted=[]
        self.prompt="总共运行了"
        for i in range(6):
            self.lasted.append(self.stop[i]-self.start[i])
            self.prompt+=str(self.lasted[i])

这时候运行代码:
w=Mytimer()
w.begin()
w.stop
然后print(w),显示:总共运行了0000012
或者我直接w,  显示:总共运行了0000012.

为什么显示结果一样?__str__跟__init__一样,在类实例时被自动调用吗?
最佳答案
2020-7-13 21:48:16
所以你直接 w 时候是调用了__repr__ 魔法方法,而 __repr__魔法方法被赋值为 __str__ 则此时调用的还是 __str__ 方法

所以这个时候你 print(w) 和直接 w 都是一样的,最终都是调用了 __str__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-13 21:42:40 | 显示全部楼层
str应该是被返回字符串时的触发操作
print返回的是一个字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 21:42:50 | 显示全部楼层
请用这个发代码,你的代码中的 [ i] 变成了编辑器的标签

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 21:45:55 | 显示全部楼层
liuzhengyuan 发表于 2020-7-13 21:42
请用这个发代码,你的代码中的 [ i] 变成了编辑器的标签

如何正确地发代码、上传图片和附件?

收到,十分感谢。之前不知道怎么上传
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 21:46:10 | 显示全部楼层


你调用都调用错了, 你应该调用的是 w.end() 而不是 w.stop() 你的类中并没有定义 stop() 方法,而定义了 end() 方法


__str__方法其实是在print()对象时调用,所以可以自己定义 str 字符串的返回信息,在该方法 return 一个字符串,如果不是字符串则报错

__repr__ 魔法方法:是在控制台直接输出一个对象信息或者print一个对象信息时调用

如果自定了__str__ ,print 时默认执行__str__

如果没有自定 __str__ ,则 print 时执行 __repr__



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 21:48:16 | 显示全部楼层    本楼为最佳答案   
所以你直接 w 时候是调用了__repr__ 魔法方法,而 __repr__魔法方法被赋值为 __str__ 则此时调用的还是 __str__ 方法

所以这个时候你 print(w) 和直接 w 都是一样的,最终都是调用了 __str__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 21:48:24 | 显示全部楼层
冰河星云 发表于 2020-7-13 21:42
str应该是被返回字符串时的触发操作
print返回的是一个字符串

你好。我不是很懂这句话。我以为只有print()了,才会调用__str__函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 21:52:24 | 显示全部楼层
KONGYIYAO 发表于 2020-7-13 21:48
你好。我不是很懂这句话。我以为只有print()了,才会调用__str__函数。

你理解的没错,当类中定义了 __str__ 魔法方法时候,print 就会自动调用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 21:53:24 | 显示全部楼层
KONGYIYAO 发表于 2020-7-13 21:48
你好。我不是很懂这句话。我以为只有print()了,才会调用__str__函数。

只要 retuen 字符串 就会触发额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-13 22:00:03 | 显示全部楼层
Twilight6 发表于 2020-7-13 21:46
你调用都调用错了, 你应该调用的是 w.end() 而不是 w.stop() 你的类中并没有定义 stop() 方法,而定义 ...

十分感谢。直接用w,等于调用了__repr__方法,直接输出对象信息。然后我代码中又赋值为__repr__=__str__,等同于print(w)的意思吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-13 22:00:35 | 显示全部楼层
KONGYIYAO 发表于 2020-7-13 22:00
十分感谢。直接用w,等于调用了__repr__方法,直接输出对象信息。然后我代码中又赋值为__repr__=__str__ ...



理解正确!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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