模块通过__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
相关产品推荐
相关产品推荐

