这是一种做一些非常接近你想要的事情的方法。而不是无条件地import
ing 中的所有包的类__init__.py
,您可以在其中定义一个函数来显式导入任何所需的函数(如果未指定,则导入所有函数)。
__init__.py
:
from pathlib import Path
import sys
print(f'In {Path(__file__).name}')
package_name = Path(__file__).parent.name
package_prefix = package_name + '.'
class_to_module_map = {'Load': 'load', 'Train': 'train', 'Test': 'test'}
def import_classes(*class_names):
namespace = sys._getframe(1).f_globals # Caller's globals.
if not class_names:
class_names = class_to_module_map.keys() # Import them all.
for class_name in class_names:
module = class_to_module_map[class_name]
temp = __import__(package_prefix+module, globals(), locals(), [class_name])
namespace[class_name] = getattr(temp, class_name) # Add to caller's namespace.
出于测试目的,这是我放入的内容load.py
script:
(我还在其他两个模块中添加了类似的内容,以验证它们是否得到了import
ed.)
load.py
:
from pathlib import Path
print(f'In {Path(__file__).name}')
class Load: pass
最后,这是一个仅使用它的示例import
the Load
class:
ad_hoc.py
:
from my_package import import_classes
#from my_package import Load
import_classes('Load')
test = Load()
print(test)
随着输出的产生:
In __init__.py
In load.py
<my_package.load.Load object at 0x001FE4A8>