Python:整个包只导入模块一次
我现在正在编写一个应用程序,它的结构大致是这样的:
main.py
+ Package1
+--- Class1.py
+--- Apps
+ Package2
+--- Class1.py
+--- Apps
所以我有两个问题:
首先,在这两个包里面,有一些模块是所有应用程序都需要的,比如:re。有没有办法一次性导入整个包所需的模块,而不是在每个需要它的文件里都导入一遍?
其次,正如你所看到的,Class1在两个包中都被使用。有没有好的方法可以在这两个包之间共享它,以避免代码重复?
3 个回答
问题1:
你必须找到一种方法来导入你的包,所以你有两个选择:
(如果我说错了或者不够详细,请纠正我)
1. 看看James的解决方案,你需要定义一个类,把所有模块放在里面,最后再导入到你的子类中。
2. 基本上在你的主类中不导入任何东西,而是只在子类中导入一次。
举个例子:(在A_1子类里面)
import re
def functionThatUseRe(input):
pass
然后在你的主类中,只需要这样做:
try:
from YourPackage import A_1 #windows
except:
import A_1 #MAC OSX
A_1.functionThatUseRe("")
这样你就完全避免了多次导入模块的问题。
问题2:把你的class1.py放在和主类同一个文件夹里,或者移动到另一个文件夹,比如Package1(&2).Apps。
import Class1
从那里开始使用代码。
针对你的第二个问题,如果你有两个名为 Class1.py
的模块,它们实际上是一样的,那么你就不需要把它复制到两个包里。你应该把它放在一个只包含两个包共有代码的地方,然后再去引用它。完全没有必要去复制这个文件,还要在两个副本中保持每次的修改。
我强烈建议不要这样做:把导入的内容和使用这些功能的模块分开,会让你更难追踪模块之间的依赖关系。
不过,如果你真的想这么做,可以考虑创建一个新的模块,叫做 common_imports
(比如这个名字),然后在里面进行你需要的导入。
接着在其他模块中,添加以下内容:
from common_imports import *
这样做应该能让你获取到那个模块中的所有公共名称(包括所有的导入内容)。