You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)统一管理连接对象

创建一个简单的包装类包裹数据库连接对象,传递该包装类实例,后续修改包装类内部属性时,所有持有该实例引用的地方都能获取到最新连接。

  1. 定义包装类:
class DBHolder:
    def __init__(self):
        self.connection = None  # 初始为None,后续赋值
  1. 修改主类代码:
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(...)
  1. 修改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属性,以此获取最新的连接对象。

  1. 修改主类的initialise_app方法:
def initialise_app(self):
    self.view_blueprint = health_view.create_blueprint(self)
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:18:42