我有一个抽象基类和一些派生类。我试图实现与基类相同的行为,即如果我的类是Base
,DerivedA
,DerivedB
,DerivedC
在文件myclass.py
中,我可以在另一个文件中写入
import myclass
a = myclass.DerivedA()
b = myclass.DerivedB()
c = myclass.DerivedC()
但是每个派生类都在自己的文件中。这必须是动态的,也就是说,我可以删除derived_c.py
并且所有的东西都能正常工作,除了现在我不能再调用myclass.DerivedC
,或者如果我添加一个derived_d.py
,我可以不用接触__init__.py
,所以简单地使用from derived_c import DerivedC
不是一个选项。在
我试着把它们都放在一个子目录中,然后放在这个目录的__init__.py
中,使用pkgutil.walk_packages()
动态导入所有文件,但是我不能让它们直接位于模块的命名空间中,也就是说,我必须调用myclass.DerivedC()
,因为我无法确定如何(或者是否可能)使用importlib来实现等效一个from xyz import *
语句的。在
有什么建议可以让我做到这一点?谢谢!在
Edit:Dynamic module import in Python的解决方案没有提供一种方法来自动将所有模块中的类导入到包的命名空间中。在
我曾经做过类似的事情,但在我的例子中,我必须动态地创建一个列表,其中包含一个特定包中基类的所有子类,所以万一您发现它很有用:
my_classes
包,其中包含Base
类和所有子类的所有文件。每个文件中只应包含一个类。在在}文件:
__init__.py
中适当地设置__all__
,导入除__init__.py
(来自this answer)之外的所有{使用
from my_classes import *
导入您的类,因为我们的自定义__all__
会将my_classes
包中的所有类添加到命名空间中。但是,这还不允许我们直接访问子类。您必须在主脚本中这样访问它们:
现在,
subclasses
是一个包含从Base
派生的所有类的列表。在相关问题 更多 >
编程相关推荐