Python中如何在多个方法乃至跨文件场景下共享使用同一变量
单文件场景解决方案
- 方案1:模块级全局变量
仅需在当前代码文件顶部完成一次db初始化,同文件下所有函数可直接读取使用:
# 文件顶部仅初始化1次db,以MongoDB为例,其他数据库逻辑一致 import pymongo db = pymongo.MongoClient("mongodb://localhost:27017/")["business_db"] def addUser(): # 直接使用db即可,无需重复定义 user_collection = db["users"] # 业务逻辑代码 def verifyUser(): user_collection = db["users"] # 业务逻辑代码 def addStuffToDB(): stuff_collection = db["goods"] # 业务逻辑代码
提示:如果需要延迟初始化db(比如等待配置加载完成后再创建连接),可以先在顶部声明
db = None,配置加载完成后再赋值,仅读取使用无需额外声明;如果需要在函数内修改db的指向,需要在函数内第一行加global db声明。
- 方案2:类封装数据库操作
将所有数据库操作函数封装为工具类的方法,db作为类属性仅初始化一次:
import pymongo class DBOperator: # 类属性,全局仅初始化1次 db = pymongo.MongoClient("mongodb://localhost:27017/")["business_db"] @classmethod def addUser(cls): user_collection = cls.db["users"] # 业务逻辑代码 @classmethod def verifyUser(cls): user_collection = cls.db["users"] # 业务逻辑代码 @classmethod def addStuffToDB(cls): stuff_collection = cls.db["goods"] # 业务逻辑代码
调用时直接执行DBOperator.addUser()即可,无需重复实例化类。
多文件场景解决方案
推荐单独抽离数据库配置模块,利用Python模块导入的单例特性实现全局复用同一个db实例:
- 新建独立的数据库配置文件
db_config.py,统一完成db初始化:
# db_config.py import pymongo # 全局仅在第一次导入时执行1次初始化 db = pymongo.MongoClient("mongodb://localhost:27017/")["business_db"]
- 所有需要操作数据库的文件,直接导入该模块的db变量使用即可:
# user.py文件 from db_config import db def addUser(): user_collection = db["users"] # 业务逻辑代码 def verifyUser(): user_collection = db["users"] # 业务逻辑代码
# goods.py文件 from db_config import db def addStuffToDB(): stuff_collection = db["goods"] # 业务逻辑代码
Python的模块为天然单例,第一次导入
db_config时会执行模块内代码完成db初始化,后续所有导入拿到的都是同一个db实例,不会重复创建数据库连接。
可选拓展方案
如果需要灵活切换数据库实例(比如单元测试时要替换为测试库),可以使用依赖注入的方式,把db作为参数传入每个函数,虽然需要额外传参,但代码耦合度更低,更利于测试和扩展。
内容的提问来源于stack exchange,提问作者green
相关产品推荐
相关产品推荐

