类属性中创建的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就代表是同一个实例,这个测试结果完全可信。
更严谨的验证方式
可以通过打印对象内存地址的方式验证:
- 把
MyModel放在model.py文件中 - 创建
file1.py:
from model import MyModel print(f"file1中engine的内存地址: {id(MyModel.engine)}")
- 创建
file2.py:
from model import MyModel print(f"file2中engine的内存地址: {id(MyModel.engine)}")
- 创建
main.py:
import file1 import file2
运行main.py,你会看到两次打印的内存地址完全相同,这就直接证明是同一个实例。
例外情况
如果是不同的Python进程(比如分别单独运行file1.py和file2.py),那么两个进程里的engine就是不同的实例——因为每个进程有独立的内存空间,模块缓存是进程隔离的。
内容的提问来源于stack exchange,提问作者Coconut water
相关产品推荐
相关产品推荐

