鱼C论坛

 找回密码
 立即注册
查看: 1150|回复: 4

[已解决]Python

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

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

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

x
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[index] - self.start[index])
            self.prompt += str(self.lasted[index])
为什么这样的函数可以不用print直接t1得出总共运行了多少时间
repr和str的顺序不应该倒过来吗才对嘛。
最佳答案
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__魔法方法的返回值了,所以这里如果你将其倒过来才是错误的

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

使用道具 举报

发表于 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__魔法方法的返回值了,所以这里如果你将其倒过来才是错误的

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

使用道具 举报

 楼主| 发表于 2020-7-20 00:56:17 | 显示全部楼层
Twilight6 发表于 2020-7-19 00:20
__str__  和 __repr__ 的主要相同点是在 print 函数被调用时候都会自动调用

__str__  和 __repr__ 的 ...

这么看出这个类定义了__repr__魔法方法。这里不是只有赋值那里出现了__repr__吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-20 00:58:31 | 显示全部楼层
breaki 发表于 2020-7-20 00:56
这么看出这个类定义了__repr__魔法方法。这里不是只有赋值那里出现了__repr__吗。

当类没有 继承任何类时候,默认继承的是 object 类,而 object 类有 __repr__ 魔法方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-20 01:20:45 | 显示全部楼层
如果我打个t1然后回车这四个函数是按照顺序全运行一遍吗,如果我打个t1.start()他就只运行start一个函数吗。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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