You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

模块通过__getattr__定义的属性y导入后无法实时更新如何解决?

问题原因与解决方案

为什么y的值不会变化?

当你使用from module import y时,Python会立即调用模块的__getattr__获取y的初始值,并将这个值绑定到当前作用域的y变量上。之后每次引用y,都是直接使用这个已经缓存的固定值,不会再触发模块的__getattr__方法,所以两次打印的y都是同一个初始时间。

解决方案1:保留属性形式,通过模块访问

不要直接导入y,而是导入整个模块,每次通过module.y访问,这样每次都会触发模块的__getattr__获取最新时间:

修改main.py:

import time
import module

x = time.time()
print(x)
time.sleep(1)
print(module.y)  # 每次访问都会调用__getattr__获取新时间
time.sleep(1)
print(module.y)

解决方案2:将y定义为可调用函数

如果希望保持from ... import的形式,可以把y改成函数,每次调用时获取最新时间:

修改module.py:

import time

def y():
    return time.time()

修改main.py:

import time
from module import y

x = time.time()
print(x)
time.sleep(1)
print(y())  # 调用函数获取当前时间
time.sleep(1)
print(y())

进阶方案:用类模拟动态属性(可选)

如果想维持“属性”的调用形式(不用括号),也可以在模块里定义一个类,通过property实现动态属性,然后导出类实例:

修改module.py:

import time

class TimeGetter:
    @property
    def y(self):
        return time.time()

time_getter = TimeGetter()

修改main.py:

import time
from module import time_getter

x = time.time()
print(x)
time.sleep(1)
print(time_getter.y)
time.sleep(1)
print(time_getter.y)

内容的提问来源于stack exchange,提问作者Robin Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:55:34