我正在尝试用Python编写一些(在我看来)可读代码。我需要一个包含许多类的模块。从理论上讲,我知道完成此任务所需的一切:我可以简单地将类定义放在一个模块文件中。
出于可读性目的,我想将每个类定义放在单独的文件中(它们开始相当冗长!),并将所有这些类放入一个目录中。每当我创建新文件时,虽然它的内容在我需要它的地方是可见的,但是里面的类定义的范围是不需要的模块。
我该怎么办?什么是“Python”方法呢?
答案 0 :(得分:8)
在__init__.py
内全部导入它们,然后让消费者导入包。
from .module1 import Class1
from .module2 import Class2
...
答案 1 :(得分:3)
如果你想避免在许多地方硬编码完整路径,文件,类和函数名,你可以做类似下面的事情,动态地导入(几乎)它在包的子目录中找到的所有Python文件。
关键是要记住__init__.py
文件本身就是一个基本上不受约束的Python脚本,因此可以自由地执行相当复杂的处理,以确定包名称空间中的内容。
档案package\__init__.py
:
def _import_package_files():
""" Dynamically import all the Python modules in this module's sub directory. """
import os
import sys
import traceback
package_path = os.path.split(__file__)[0]
package_directory = os.path.split(package_path)[1]
for fn in os.listdir(package_directory):
globals_, locals_ = globals(), locals()
# process all python files in directory that don't start with underscore
if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'):
modulename = fn.split('.')[0] # filename without extension
subpackage = ".".join([package_directory, modulename])
try:
module = __import__(subpackage, globals_, locals_, [modulename])
except:
traceback.print_exc(file=sys.stdout)
raise # reraise exception
_import_package_files()
档案package\Class1.py
:
class Class1(object):
pass
档案package\Class2.py
:
class Class2(object):
pass
档案package\Class3.py
:
class Class3(object):
pass
档案usepackage.py
:
import package
print(package.Class1)
print(package.Class2)
print(package.Class3)
运行usepackage.py
的输出:
<module 'package.Class1' from 'C:\Files\package\Class1.pyc'>
<module 'package.Class2' from 'C:\Files\package\Class2.pyc'>
<module 'package.Class3' from 'C:\Files\package\Class3.pyc'>