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

类属性中创建的SQLAlchemy Engine在多文件中是否为同一实例?

类属性跨文件实例一致性问题

问题背景

我定义了如下Python类:

from sqlalchemy import create_engine

class MyModel:
    engine = create_engine('sqlite:///example.db')

想了解在另外两个Python文件中使用该类时,这两个文件中的engine是否为同一实例。我曾在文件B中导入文件A,通过is运算符判断结果为True,但认为该测试不够严谨,推测结果应该为False。

解答

只要是在同一个Python解释器进程中,两个文件里的MyModel.engine必然是同一个实例,你的测试结果是准确的,原因如下:

  • Python模块导入采用「单例缓存」机制:一个模块首次被导入时,会执行其代码并将模块对象存入sys.modules缓存;后续任何地方再导入该模块,都会直接复用缓存里的对象,不会重新执行模块代码。
  • MyModel的engine是类属性,在类定义时(也就是模块首次被导入时)初始化,只会创建一次实例。不管在多少个文件中导入这个类,只要是同一进程,拿到的都是同一个类对象,对应的类属性自然是同一个实例。
  • is运算符是判断对象同一性最严谨的方式:它直接对比两个对象的内存地址,返回True就代表是同一个实例,这个测试结果完全可信。

更严谨的验证方式

可以通过打印对象内存地址的方式验证:

  1. 把MyModel放在model.py文件中
  2. 创建file1.py:
from model import MyModel
print(f"file1中engine的内存地址: {id(MyModel.engine)}")
  1. 创建file2.py:
from model import MyModel
print(f"file2中engine的内存地址: {id(MyModel.engine)}")
  1. 创建main.py:
import file1
import file2

运行main.py,你会看到两次打印的内存地址完全相同,这就直接证明是同一个实例。

例外情况

如果是不同的Python进程(比如分别单独运行file1.py和file2.py),那么两个进程里的engine就是不同的实例——因为每个进程有独立的内存空间,模块缓存是进程隔离的。

内容的提问来源于stack exchange,提问作者Coconut water

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:32:34