2010-03-17 4144 views
1

我有一个文件,myfile.py,其中进口Class1file.pyfile.py包含​​,file3.pyfile4.py进口不同的类。Python的进口

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

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

+0

是什么动机让你问这个问题? – 2010-03-17 02:19:54

+0

我有这个开源代码,我下载了。他们正在做这样的事情。我曾与Java合作过,我知道这在java中不可行。很困惑,问道。 – Boolean 2010-03-18 02:04:59

回答

8

最佳做法是导入每个定义所需标识符的模块,并使用这些标识符作为符合条件的;只有当您导入的内容来自软件包内的模块时,我才推荐使用from。 SO上经常讨论这个问题。

导入模块,说moda,从许多模块(比如modbmodcmodd,...)需要一个或多个标识符moda定义,不会减慢你的速度:moda的字节码被加载(并可能根据需要从它的源代码构建)只有一次,第一次moda被导入到任何地方,那么该模块的所有其他导入都将使用包含高速缓存的快速路径(将dict映射模块名称映射到模块对象,可访问为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,那么你可以从我的文件中作为file1.file2.SomeClass来访问这个类。 (这些通常不是最好的办法,特别是不是第二个例子。)

这很容易测试。

+4

但请,请不要这样做。明确导入您的代码需要的所有模块。 – 2010-03-17 01:19:03

+0

是的,没有。根据file1.py应​​该如何工作,它可能是访问'SomeClass'的正确位置。 (后面的例子总是不好的形式。) – 2010-03-17 02:07:16

0

在myfile模块中,您可以执行from file import ClassFromFile2from file2 import ClassFromFile2来访问ClassFromFile2,假定类也被导入到文件中。

这种技术通常用于简化API。例如,一个db.py模块可能会从模块mysqldb,sqlalchemy和一些其他helper中导入各种东西。相比之下,一切都可以通过db模块来访问。

0

如果使用通配符导入,yes,通配符导入实际上是在当前名称空间中为导入模块的内容创建新别名的方式。如果不是,您需要像平常一样使用您导入的模块的命名空间。

+0

当然,你永远不应该使用'import *'。 – 2010-03-17 02:49:29