访问类中的数据库对象时如何避免全局变量?
在设计 Python 类时,使用全局变量会引入潜在的可维护性和线程安全性问题。为了避免全局变量,建议通过以下方法来访问类中的数据库对象:
通过构造函数将数据库对象传递给类的实例属性,确保数据库对象是类实例的私有属性,而不是全局变量。
import sqlite3
class DatabaseHandler:
def __init__(self, db_connection):
self._db = db_connection # 使用实例属性存储数据库连接
def execute_query(self, query, params=None):
params = params or ()
cursor = self._db.cursor()
cursor.execute(query, params)
return cursor.fetchall()
# 创建数据库连接
db_connection = sqlite3.connect("example.db")
# 将数据库连接传递给类
handler = DatabaseHandler(db_connection)
# 使用类方法执行查询
result = handler.execute_query("SELECT * FROM users WHERE age > ?", (30,))
通过依赖注入模式,将数据库对象作为参数传递到类的方法或构造函数中。
class UserService:
def __init__(self, db_connection):
self._db = db_connection
def get_users(self):
cursor = self._db.cursor()
cursor.execute("SELECT * FROM users")
return cursor.fetchall()
# 数据库连接通过依赖注入传入
db_connection = sqlite3.connect("example.db")
user_service = UserService(db_connection)
users = user_service.get_users()
创建一个工厂方法或类,用于生成数据库连接并传递给其他类,避免直接使用全局变量。
class DatabaseFactory:
@staticmethod
def create_connection():
return sqlite3.connect("example.db")
class UserRepository:
def __init__(self, db_connection):
self._db = db_connection
def find_all_users(self):
cursor = self._db.cursor()
cursor.execute("SELECT * FROM users")
return cursor.fetchall()
# 使用工厂创建数据库连接
db_connection = DatabaseFactory.create_connection()
repository = UserRepository(db_connection)
users = repository.find_all_users()
将数据库连接封装到上下文管理器中,确保连接生命周期的管理更加清晰,同时避免全局变量。
import sqlite3
class DatabaseContext:
def __enter__(self):
self.connection = sqlite3.connect("example.db")
return self.connection
def __exit__(self, exc_type, exc_val, exc_tb):
if self.connection:
self.connection.close()
class UserService:
def __init__(self, db_connection):
self._db = db_connection
def get_users(self):
cursor = self._db.cursor()
cursor.execute("SELECT * FROM users")
return cursor.fetchall()
# 使用上下文管理器创建连接
with DatabaseContext() as db_connection:
user_service = UserService(db_connection)
users = user_service.get_users()
对于需要全局共享的数据库对象,可以使用单例模式代替全局变量。
class DatabaseSingleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.connection = sqlite3.connect("example.db")
return cls._instance
class UserService:
def __init__(self, db_connection):
self._db = db_connection
def get_users(self):
cursor = self._db.cursor()
cursor.execute("SELECT * FROM users")
return cursor.fetchall()
# 单例获取数据库连接
db_instance = DatabaseSingleton()
user_service = UserService(db_instance.connection)
users = user_service.get_users()
避免全局变量的关键是通过构造函数传参或依赖注入,将数据库对象的管理与使用分离。每种方法都有其适用场景,可以根据项目的复杂度和需求选择最合适的方案。
2025 年陆剧市场依旧热度爆棚
时间:2025-09-19
阵地央一首播:年度高品质大剧,深度解锁文化抗战三重非凡意义
时间:2025-09-18
陈展鹏刘佩玥《巨塔之后》今首播
时间:2025-08-28
生万物大结局惊现最招恨角色,原来真正的坏都披着善的“羊皮”!
时间:2025-08-28
归队6集燃爆:袁姗姗化身“战地玫瑰”,实战军医双在线超吸睛!
时间:2025-08-28
许凯田曦薇新剧《子夜归》首播,点击率位列第七
时间:2025-08-21