鱼C论坛

 找回密码
 立即注册
查看: 128|回复: 1

[技术交流] python 类属性与方法同名时遇见的问题

[复制链接]
发表于 2024-10-16 23:07:18 | 显示全部楼层 |阅读模式

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

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

x
有如下一段代码:
import time as t

class MyTimer():
        
    def __str__(self):
        return self.prompt

    __repr__ = __str__
   
    #开始计时
    def start(self):
        self.start = t.localtime()
        print('开始计时.....')
    #计时结束
    def stop(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])
        #print(self.prompt)

当执行如下代码时:
>>t1 = MyTimer()
>>t1.start()
开始计时.....
>>t1.start()
Traceback (most recent call last):
  File "<pyshell#219>", line 1, in <module>
    t1.start()
TypeError: 'time.struct_time' object is not callable

当第一次执行t1.start(),发现可以正常输出, 但是当第二次再执行t1.start()时, 才提示TypeError, 为何第二次调用t1.start()才开始提示, 而第一次调用t1.start()却不提示?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-16 23:07:27 | 显示全部楼层
这是因为方法名 `start` 和实例属性名 `start` 冲突导致的问题。

当你第一次调用 `t1.start()` 时,`start()` 方法正常被调用,并且在方法内部将 `self.start` 赋值为 `t.localtime()`,这在类实例上创建了一个属性 `start`。

第二次调用 `t1.start()` 时,Python 解释器发现 `self` 已经有一个名为 `start` 的属性,所以再调用 `t1.start()` 时,试图将其作为一个可以调用的函数来使用,但实际上它是 `time.struct_time` 对象,因此抛出了 `TypeError`。

为了解决这个问题,你可以选择不同的名字来命名属性和方法。例如,可以将属性名设为 `_start_time`,这样就不会与方法名冲突:
class MyTimer():
    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def start(self):
        self._start_time = t.localtime()
        print('开始计时.....')

    def stop(self):
        self._stop_time = t.localtime()
        self._calc()
        print('计时结束!')

    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for i in range(6):
            self.lasted.append(self._stop_time[i] - self._start_time[i])
            self.prompt += str(self.lasted[i])

这样修改后,方法名和属性名就不会再冲突了,也就不会导致 `TypeError`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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