我有一个父类,它提供了用于操作硬件的抽象函数,以及一个充满子类的子目录,这些类是子类的子类,并提供特定于硬件的实现(例如x86函数,ARM函数......)。我正在寻找一种Pythonic方法来导入目录中的文件,并实例化它们。
目前,父类位于顶级目录中,子类位于子目录中。这可以改变,风格或易于实施。
是否最好通过在配置文件中定义它们的列表来加载子目录中的所有特定于硬件的类,并迭代它们以导入它们?或者使用importlib自动执行它会更好(更Pythonic)?或者没关系?
答案 0 :(得分:1)
构建像这样的文件夹结构:
.
├── arm (i kept this one empty, see similar x86 folder)
├── hal
│ ├── flags.py
│ ├── __init__.py
│ └── registers.py
├── x86
│ ├── flags.py
│ ├── __init__.py
│ └── registers.py
└── 8086.py
将ARM模块放在arm
文件夹,x86模块放在x86
文件夹中,依此类推。
将硬件父类放在并行文件夹中,由hal
文件夹在树中表示。请注意,您可能在每个拱门(在相应的文件夹中)具有特定模块,这些模块在hal
文件夹中具有相同的通用模块名称(但这只是建议)。
在父文件夹中的8086.py
等文件中构建硬件。
8086.py
代码示例:
from x86 import Ax, Bx, ZF # only the classes you need
ax = Ax()
bx = Bx()
# build your remaining CPU...
hal/flags.py
的示例:
class ZeroFlag():
pass
hal/registers.py
的示例:
class Register:
pass
hal/__init__.py
的示例:
from hal.registers import Register
from hal.flags import ZeroFlag
x86/flags.py
from hal import ZeroFlag
class ZF(ZeroFlag):
pass
x86/registers.py
from hal import Register
class Ax(Register):
pass
class Bx(Register):
pass
x86/__init__.py
from .registers import *
from .flags import *
现在,在每个arch中,特定模块可以继承和自定义hal
中的泛型类。在顶级文件夹模块中,您可以导入这些特定内容以构建您的CPU或您正在制作的任何硬件。
请注意__init__.py
个文件的重要性。他们把文件夹变成包。 __init__
也可以在程序包导入上运行,允许您指定要供导入程序使用的所有程序包模块。另请注意,此列表不会强制导入程序导入所有名称。它只能指定想要的那些。
如果您有大量文件,可以将代码放在__init__.py
文件中以自动执行导入,而不是手动编写所有文件。