KONGYIYAO 发表于 2020-7-13 21:40:19

请问__str__函数的调用问题

本帖最后由 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-self.start)
            self.prompt+=str(self.lasted)

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

为什么显示结果一样?__str__跟__init__一样,在类实例时被自动调用吗?

冰河星云 发表于 2020-7-13 21:42:40

str应该是被返回字符串时的触发操作
print返回的是一个字符串

liuzhengyuan 发表于 2020-7-13 21:42:50

请用这个发代码,你的代码中的 [ i] 变成了编辑器的标签

如何正确地发代码、上传图片和附件?
https://fishc.com.cn/thread-52272-1-1.html
(出处: 鱼C论坛)

KONGYIYAO 发表于 2020-7-13 21:45:55

liuzhengyuan 发表于 2020-7-13 21:42
请用这个发代码,你的代码中的 [ i] 变成了编辑器的标签

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


收到,十分感谢。之前不知道怎么上传

Twilight6 发表于 2020-7-13 21:46:10



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


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

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

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

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


Twilight6 发表于 2020-7-13 21:48:16

所以你直接 w 时候是调用了__repr__ 魔法方法,而 __repr__魔法方法被赋值为 __str__ 则此时调用的还是 __str__ 方法

所以这个时候你 print(w) 和直接 w 都是一样的,最终都是调用了 __str__

KONGYIYAO 发表于 2020-7-13 21:48:24

冰河星云 发表于 2020-7-13 21:42
str应该是被返回字符串时的触发操作
print返回的是一个字符串

你好。我不是很懂这句话。我以为只有print()了,才会调用__str__函数。

Twilight6 发表于 2020-7-13 21:52:24

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

你理解的没错,当类中定义了 __str__ 魔法方法时候,print 就会自动调用

冰河星云 发表于 2020-7-13 21:53:24

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

只要 retuen 字符串 就会触发额

KONGYIYAO 发表于 2020-7-13 22:00:03

Twilight6 发表于 2020-7-13 21:46
你调用都调用错了, 你应该调用的是 w.end() 而不是 w.stop() 你的类中并没有定义 stop() 方法,而定义 ...

十分感谢。直接用w,等于调用了__repr__方法,直接输出对象信息。然后我代码中又赋值为__repr__=__str__,等同于print(w)的意思吗?

Twilight6 发表于 2020-7-13 22:00:35

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


理解正确!
页: [1]
查看完整版本: 请问__str__函数的调用问题