Python 导入问题
我有一个文件,叫做 myfile.py
,它从 file.py
中引入了 Class1
。而 file.py
里面又引入了 file2.py
、file3.py
和 file4.py
中的不同类。
在我的 myfile.py
中,我能直接使用这些类吗?还是说我还需要再去引入 file2.py
、file3.py
等文件呢?
Python 会自动把我引入的文件里面的所有内容都加进来吗?我能直接使用它们吗?
5 个回答
如果你使用的是通配符导入,那么通配符导入实际上是在你的当前命名空间中为导入模块的内容创建新的别名。如果没有使用通配符导入,你就需要像往常一样使用你导入的模块的命名空间。
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
来访问这个类。(不过这样做一般不是最好的方法,尤其是第二种情况。)
这个很容易测试。
最佳做法是导入每个定义了你需要的标识符的模块,并使用模块名来引用这些标识符;我建议只有在你导入的是包内的模块时,才使用 from
。这个问题在StackOverflow上经常被讨论。
假设你有一个模块叫 moda
,而其他很多模块(比如 modb
、modc
、modd
等)都需要 moda
定义的一个或多个标识符。导入 moda
并不会让你变慢:moda
的字节码只会在第一次导入时加载(如果需要的话,可能还会从源代码构建),之后所有其他对这个模块的导入都会使用一个快速的方式,这个方式涉及到一个缓存(这是一个字典,用来把模块名映射到模块对象,如果需要的话可以通过 sys.modules
访问...当然前提是你先 import sys
!)。