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)

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

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

相关推荐
weixin_307779135 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天8 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel8 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
海绵宝宝转agent8 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭8 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT9 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071579 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境10 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/10 小时前
5.java-数组
java·开发语言