Python链式传递引用参数问题:MySQL连接实例未同步更新
Python中传递数据库连接实例后无法同步更新的问题解决
问题根源
Python的变量传递是传对象引用,但你当前的写法存在关键误区:
- 主类初始化时
self._db_object为None,调用initialise_app时把这个None传递给create_blueprint,View类的self._db_connector保存的是对这个None的引用。 - 后续主类把
self._db_object赋值为新的MySQLConnection实例时,只是重新绑定了self._db_object变量的指向,View里的self._db_connector仍然指向原来的None,不会自动同步更新。
解决方案1:用包装类(Holder)统一管理连接对象
创建一个简单的包装类包裹数据库连接对象,传递该包装类实例,后续修改包装类内部属性时,所有持有该实例引用的地方都能获取到最新连接。
- 定义包装类:
class DBHolder: def __init__(self): self.connection = None # 初始为None,后续赋值
- 修改主类代码:
def __init__(self, quart_instance) -> None: self._db_holder = DBHolder() # 用Holder代替直接存储None def initialise_app(self): self.view_blueprint = health_view.create_blueprint(self._db_holder) # 后续初始化数据库连接时,修改Holder里的connection属性 self._db_holder.connection = mysql_connection.MySQLConnection(...)
- 修改Health View代码:
def create_blueprint(db_holder): view = View(db_holder) class View: def __init__(self, db_holder): self._db_holder = db_holder # 访问数据库时,通过holder获取最新连接 def health_check(self): if self._db_holder.connection is not None: # 执行数据库操作,比如查询连接状态 pass
解决方案2:让View持有主类实例的引用
直接把主类实例传递给View,View后续直接访问主类的_db_object属性,以此获取最新的连接对象。
- 修改主类的
initialise_app方法:
def initialise_app(self): self.view_blueprint = health_view.create_blueprint(self)
- 修改Health View代码:
def create_blueprint(app_instance): view = View(app_instance) class View: def __init__(self, app_instance): self._app = app_instance def health_check(self): db_connector = self._app._db_object if db_connector is not None: # 执行数据库操作 pass
内容的提问来源于stack exchange,提问作者Swatcat
相关产品推荐
相关产品推荐

