Namespacing and classes
我正在尝试用Python编写一些(在我看来)可读的代码。我需要一个包含许多类的模块。理论上,我知道实现这一点所需的一切:我可以简单地将类定义放在一个模块文件中。
为了便于阅读,我想将每个类定义放在单独的文件中(它们开始变得很长!)将所有这些类放到一个目录中。每当我创建新文件时,尽管它的内容在我需要它们的地方是可见的,但是在其中的类定义的作用域是不需要的模块。
我该怎么做?"python"是怎么做到的?
在
1 2 3 | from .module1 import Class1 from .module2 import Class2 ... |
如果希望避免在许多地方对完整路径、文件、类和函数名进行硬编码,可以执行如下操作:动态导入(几乎)它在包的子目录中找到的所有python文件。
关键是要记住,
文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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() |
号
文件
1 2 | class Class1(object): pass |
文件
1 2 | class Class2(object): pass |
。
文件
1 2 | class Class3(object): pass |
文件
1 2 3 4 5 | import package print(package.Class1) print(package.Class2) print(package.Class3) |
。
运行
1 2 3 | <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'> |
。