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)

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

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

相关推荐
ServBay5 小时前
9 个 Python 第三方库推荐,不用 AI 都好像多出一个团队
后端·python
用户8356290780515 小时前
如何使用 Python 添加和管理 Excel 批注(完整示例)
后端·python
用户8356290780515 小时前
使用 Python 管理 Excel 工作表:创建、复制、删除与重命名
后端·python
荣码14 小时前
LangGraph多Agent协作:3个Agent干活比1个强,但我踩了4个坑
java·python
用户8356290780511 天前
Python 操作 PDF 附件:添加、查看与管理指南
后端·python
宇宙之一粟2 天前
乐企版式文件生成平台
java·后端·python
学测绘的小杨2 天前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
zzzzzz3103 天前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
雪隐3 天前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
兵慌码乱3 天前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构