Python 全局变量调用了一个函数,如何实现每次使用时都运行一次函数获取最新的结果

直接说结论:不要用普通变量,要用"函数 / 属性 / 代理对象"来模拟全局变量。


✅ 推荐方案(从简单到优雅)


方案一:用函数替代"全局变量"(最推荐 👍)

python 复制代码
def df():
    return pd.read_sql("SELECT * FROM your_table", conn)

# 使用时
data = df()

👉 特点:

  • 每次调用都会重新查
  • 写法最清晰
  • 不容易踩坑

📌 本质:把"变量"变成"动态获取"


方案二:用 @property(适合类封装)

python 复制代码
class GlobalData:
    @property
    def df(self):
        return pd.read_sql("SELECT * FROM your_table", conn)

global_data = GlobalData()

# 使用
data = global_data.df

👉 看起来像变量:

python 复制代码
global_data.df   # 实际每次都会执行 SQL

方案三:用懒加载对象(高级写法)

如果你真的想写成:

python 复制代码
df = something
print(df)  # 每次都刷新

可以用 __getattr__ 或代理对象:

python 复制代码
class DynamicDF:
    def __call__(self):
        return pd.read_sql("SELECT * FROM your_table", conn)

    def __repr__(self):
        return str(self())

df = DynamicDF()

# 用法
print(df())   # 推荐
print(df)     # 也会触发(因为 __repr__)

👉 但这个不太建议

  • 可读性差
  • 容易误导别人以为是静态变量

❌ 不推荐方式(你可能会想到)

python 复制代码
df = pd.read_sql(...)

然后试图"自动更新" → ❌ 做不到

因为 Python 变量不会自动重新执行表达式


🧠 核心理解

你想要的是:

"访问变量 → 自动执行逻辑"

但 Python 默认是:

"变量 = 已经计算好的值"

所以必须引入一层"函数 / 属性 / 动态代理"


🚀 最适合你的选择

结合你现在做的系统(数据 / CRM / 后端逻辑),我建议:

👉 用函数(方案一)

简单、清晰、团队也容易理解

如果你想写得更"像全局"一点:

👉 用 @property(方案二)


🔥 一个更工程化的版本(推荐)

python 复制代码
def get_df(force_refresh=False):
    return pd.read_sql("SELECT * FROM your_table", conn)

未来你可以很容易扩展成:

  • 加缓存
  • 加日志
  • 加监控
  • 加权限控制

相关推荐
人工干智能18 分钟前
爱因斯坦求和约定(Einstein Summation Convention)及einsum() 函数
python
YMWM_20 分钟前
查看realsense相机序列号脚本
开发语言·python·数码相机
lbb 小魔仙40 分钟前
Python 项目 CI/CD 实战:用 GitHub Actions 搭建自动化测试、覆盖率与发布流水线
python·ci/cd·github
传奇开心果编程41 分钟前
【dioxus0.7基础语法学与练】第8课:RSX 宏 — Dioxus 声明式 UI 语法
开发语言·学习·rust
西瓜太郎12341 小时前
request_id 如何串起请求、路由、计费和日志
后端·python
troy1281 小时前
Python 基础语法(一):变量、数据类型与运算符
java·服务器·python
wuyk5551 小时前
18.Kruskal 算法:用最短的边连成一张网
开发语言·算法·图论
Evand J1 小时前
【MATLAB例程,图像降噪7】高斯加权滑动窗口滤波,用于图像降噪,带质量评价,附代码下载链接
开发语言·图像处理·matlab·滑动窗口·滤波·降噪·图像滤波
用户298698530141 小时前
Python 将 Word 文档转换为图片的实践指南
后端·python·api
十年一梦惊觉醒1 小时前
快手视频发布助手,全自动视频发布带货工具
开发语言·前端·javascript