Python 导入

问题描述 投票:0回答:5

我有一个文件

myfile.py
,它从
Class1
导入
file.py
,并且
file.py
包含对
file2.py
file3.py
file4.py
中不同类的导入。

在我的

myfile.py
中,我可以访问这些类还是需要再次导入file2.py、file3.py等?

Python 会自动添加我导入的文件中包含的所有导入吗?我可以自动使用它们吗?

python import
5个回答
11
投票

最佳实践是导入定义所需标识符的每个模块,并通过模块名称使用这些标识符作为qualified;我建议仅当您导入的是包内的模块时才使用

from
。这个问题经常在 SO 上讨论。

从需要一个或多个

moda
定义的标识符的许多模块(例如
modb
modc
modd
...)导入一个模块(例如
moda
),不会减慢您的速度:
moda
的字节码仅加载一次(如果需要,可能从其源构建),第一次将
moda
导入到任何地方,然后模块的所有其他导入都使用涉及缓存的快速路径(字典映射)模块名称到模块对象,在需要时可通过
sys.modules
访问...如果您首先
import sys
,当然!-).


1
投票

Python 不会自动将任何内容引入 myfile.py 的命名空间中,但您可以访问所有其他模块的命名空间中的所有内容。

也就是说,如果在 file1.py 中你做了

from file2 import SomeClass
并且在 myfile.py 中你做了
import file1
,那么你可以在 myfile 中以
file1.SomeClass
的形式访问它。如果在 file1.py 中你做了
import file2
并且在 myfile.py 中你做了
import file1
,那么你可以从 myfile 中以
file1.file2.SomeClass
的形式访问该类。 (这些通常不是最好的方法,尤其是第二个例子。)

这很容易测试。


0
投票

在 myfile 模块中,您可以执行

from file import ClassFromFile2
from file2 import ClassFromFile2
来访问 ClassFromFile2,假设该类也在文件中导入。

此技术通常用于稍微简化 API。例如,db.py 模块可能会从 mysqldb、sqlalchemy 和其他一些助手模块导入各种内容。然后,一切都可以通过 db 模块访问。


0
投票

如果您使用通配符导入,是的,通配符导入实际上是在当前命名空间中为导入模块的内容创建新别名的方法。如果没有,您需要照常使用已导入模块的命名空间。


0
投票

如果您专门导入一个类,那么语法类似于:

from file import Class1

这意味着没有其他实体被导入到命名空间中。

更一般地说,如果您使用通配符导入

from file import *

然后您将导入该模块或包中不以“_”开头的所有内容(文件包目录中的

__init__.py
文件)。如果在该模块或包中定义了
__all__
,那么它将仅导入该列表中的符号。

最后,如果您直接导入模块或包,则该模块或包中的所有符号都会被导入:

import file
from package import file
  • 注意 - 这里的文件是文件名减去“.py”扩展名 - 我使用它是因为那是在OP的示例中。
  • 注意 - 从技术上讲,所有定义的东西都是可访问的 - 但 python 假设你正在访问你应该访问的东西。您需要将命名空间链接在一起:
    file.file2.class2
    

    但这很糟糕,因为它可能违反模块或包试图为您定义的“接口”。

  • 注意 - 模块使用“__all__”变量定义其接口。包是一个包含“__init__.py”模块的目录。但“__all__”列表仅在您使用“from x import *”格式时才有效。
  • © www.soinside.com 2019 - 2024. All rights reserved.