python 类属性与方法同名时遇见的问题
有如下一段代码: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 - self.start)
self.prompt +=str(self.lasted)
#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()却不提示? 这是因为方法名 `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 - self._start_time)
self.prompt += str(self.lasted)
这样修改后,方法名和属性名就不会再冲突了,也就不会导致 `TypeError`。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]