breaki 发表于 2020-7-19 00:09:50

Python

import time as a
class MyTimer:
    def __str__(self):
      return self.prompt
    __repr__ = __str__
    def start(self):
      self.start = a.localtime()
      print('计时开始...')
    def stop(self):
      self.stop = a.localtime()
      self._calc()
      print('计时结束!')
    def _calc(self):
      self.lasted = []
      self.prompt = '总共运行了'
      for index in range (6):
            self.lasted.append(self.stop - self.start)
            self.prompt += str(self.lasted)
为什么这样的函数可以不用print直接t1得出总共运行了多少时间
repr和str的顺序不应该倒过来吗才对嘛。

Twilight6 发表于 2020-7-19 00:20:26


__str__和 __repr__ 的主要相同点是在 print 函数被调用时候都会自动调用

__str__和 __repr__ 的主要不同点是__repr__ 魔法方法,在对象被调用时候也会返回__repr__设置的返回值字符串信息

而当 __str__和 __repr__同时在类中被定义时候,print 只会自动调用 __str__ 魔法方法,只有在 __str__ 魔法方法没有定义时候,才会调用 __repr__ 魔法方法

而且 __repr__ 主要负责对象被读取时候的自动调用返回内容,而__str__主要负责 print 函数时候自动调用返回内容

为什么这样的函数可以不用print直接t1得出总共运行了多少时间?repr和str的顺序不应该倒过来吗才对嘛?

因为这个类定义了 __repr__ 魔法方法,所以你调用实例对象 t1 的时候会自动调用 __repr__ 魔法方法

而这个 MyTimer 类中,__repr__魔法方法被 __str__赋值了,所以说返回值是和 魔法方法__str__ 返回的一样

也就是这里,print 时候会自动调用 __str__ 方法,和你不print 直接 t1 调用了 __repr__方法效果是一样的

因为 __repr__ 魔法方法被赋值为__str__魔法方法的返回值了,所以这里如果你将其倒过来才是错误的

breaki 发表于 2020-7-20 00:56:17

Twilight6 发表于 2020-7-19 00:20
__str__和 __repr__ 的主要相同点是在 print 函数被调用时候都会自动调用

__str__和 __repr__ 的 ...

这么看出这个类定义了__repr__魔法方法。这里不是只有赋值那里出现了__repr__吗。

Twilight6 发表于 2020-7-20 00:58:31

breaki 发表于 2020-7-20 00:56
这么看出这个类定义了__repr__魔法方法。这里不是只有赋值那里出现了__repr__吗。

当类没有 继承任何类时候,默认继承的是 object 类,而 object 类有 __repr__ 魔法方法

breaki 发表于 2020-7-20 01:20:45

如果我打个t1然后回车这四个函数是按照顺序全运行一遍吗,如果我打个t1.start()他就只运行start一个函数吗。
页: [1]
查看完整版本: Python