鱼C论坛

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

[技术交流] 关于python的属性名与方法名相同时, 属性会覆盖方法疑问

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

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

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

x
本帖最后由 鬼少 于 2024-10-16 22:55 编辑

有如下一段代码:
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
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=16, tm_hour=22, tm_min=48, tm_sec=56, tm_wday=2, tm_yday=290, tm_isdst=0)
>>t1.stop()
计时结束!
>>t1.stop
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=16, tm_hour=22, tm_min=49, tm_sec=8, tm_wday=2, tm_yday=290, tm_isdst=0)

当执行t1.start, 此时的类属性start与方法start()同名,属性应该覆盖方法, 那为何此时调用t1.start()不报错误?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-16 22:54:31 | 显示全部楼层
在 Python 中,当一个实例属性与实例方法重名时,实例属性会覆盖方法,导致该方法无法通过实例直接调用。不过,由于某些原因,你在代码中没有遇到直接报错。

### 为什么调用 `t1.start` 才不报错?

1. **属性覆盖方法**: 当你在 `start` 方法中设定 `self.start = t.localtime()` 时,你把实例方法 `start()` 被 `self.start` 这个实例属性覆盖掉了。所以之后的`print(t1.start)`实际上是在访问这个实例属性,而不是调用方法。

2. **访问属性**: 当你输入 `t1.start` 时,你并没有尝试调用 `start()` 方法,而是直接访问了被覆盖的属性 `self.start`。这就是为什么没有出现报错,而是显示了时间数据。

### 为什么对 `t1.start()` 没有影响?

- 你在首次调用 `t1.start()` 时,`start()` 方法能正常执行,因为在这个方法中 `self.start` 还没有被属性覆盖。
  
### 如何避免这种问题?

- 为了避免属性与方法同名问题,推荐使用不同的命名规则,比如加上前缀、后缀(如 `_start_time`、`start_timer`),或通过“私有属性”命名 (如 `self._start`),这可以避免不小心覆盖方法。

在 Python 中,良好的命名习惯不仅能避免易错的重名问题,也能提升代码可读性哦。

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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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