Python是否在我的'from Bla import bla'语句中引用了相同的实例?

dun*_*bok 1 python python-module python-import

假设我有以下伪代码.bla两个文件中的导入是指引用2个实例Bla还是引用同一个实例?换句话说,我可以在Python中连接和断开不同文件中的单个连接吗?

bla.py

import socket
class Bla:
  connect(self):
    self.connection = socket.socket(...)
  disconnect(self):
    self.connection.close()
bla = Bla()
Run Code Online (Sandbox Code Playgroud)

hello.py

from bla import bla
bla.connect()
Run Code Online (Sandbox Code Playgroud)

world.py

from bla import bla
bla.disconnect()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 8

是的,在in hello和in world中都bla引用了同一个实例.

模块是单例,只有一个副本的命名空间.当您的模块第一次导入时,顶级语句(函数和生成器之外的所有内容)仅执行一次.

模块在sys.modules映射中进行管理.首先导入可确保加载并存在模块sys.modules,然后在导入名称空间中绑定名称.从本质上讲,from bla import blabla = sys.modules['bla'].bla赋值语句相同的是.因此,只需将模块加载到内存中一次,bla = Bla()只执行一次,所有进一步的导入将访问该实例的一个引用.

import声明文件:

基本的import语句(无from子句)分两步执行:

  1. 找到一个模块,必要时加载并初始化它
  2. import语句出现的作用域的本地名称空间中定义一个或多个名称.

[...]

from表单使用一个稍微复杂的过程:

  1. 找到from子句中指定的模块,必要时加载并初始化它;
  2. 对于import子句中指定的每个标识符:
    1. 检查导入的模块是否具有该名称的属性
    2. 如果没有,尝试导入具有该名称的子模块,然后再次检查导入的模块中的该属性
    3. 如果找不到该属性,ImportError则引发该属性.
    4. 否则,对该值的引用将存储在本地名称空间中,as如果它存在则使用子句中的名称,否则使用属性名称

(大胆强调我的).