我有一个带有一些文件的包装,并且有一些进口问题。 假设我有以下文件:
main.py
Lib
├─ __init__.py
├─ file1.py
└─ file2.py
main.py :
from Lib import ClassA
foo = ClassA('anything')
库/init.py:
from .file1 import ClassA
from .file2 import ClassB
file1.py :
import a_lot_of_things
class ClassA:
pass
file2.py :
import a_lot_of_other_things
class ClassB:
pass
此代码有效,但是Python还将导入文件中的所有其他类,作为ClassB。问题在于,Python需要花费很多时间来导入所有我不想使用的file2.py库。
我知道它的发生是因为Python正在运行init.py并且它正在导入所有类,即使我只要求一个类。但是我认为只有在我写以下内容时,它才应该这样做:
from Lib import *
是否可以在init.py中检查是否要导入全部或仅一个特定的类来仅运行此文件/导入?
我也尝试过这样构造目录:
main.py
Lib
├─ __init__.py
├─ ClassA
│ ├─ __init__.py
│ └─ file1.py
└─ ClassB
├─ __init__.py
└─ file2.py
所以我清理了Lib / init.py并将导入内容放入每个init.py中。
ClassA / init.py :
from .file1 import ClassA
ClassB / init.py :
from .file2 import ClassB
但是现在我需要以这种方式使用它:
main.py :
from Lib import ClassA
foo = ClassA.ClassA('anything')
就像我之前写的那样,我想直接使用它。有办法吗?
答案 0 :(得分:0)
如果您导入模块(或从模块中导入内容),则该模块导入的所有内容也将被导入。
您只能通过将导入放置在本地上下文中来避免这种情况
例如
my_module:
import some_stuff
def do_stuff()
pass
def do_some_specific_things()
import some_specific_stuff_only_relevant_to_this_function
pass
如果您现在呼叫from my_module import do_stuff
,则将执行import some_stuff
,但不会执行import some_specific_stuff_only_relevant_to_this_function
。
顺便说一下,按如下所示构造代码是没有道理的:
main.py
Lib
├─ __init__.py
├─ ClassA
│ ├─ __init__.py
│ └─ file1.py
└─ ClassB
├─ __init__.py
└─ file2.py
一个类在模块内(file1
和file2
是模块)。一个模块不能坐在一个类中。