让我们考虑一个应用程序,其中我有一个基类Move及其变体Walk和Run。我想将它们分成不同的类。我还希望能够从基类中获取可能的移动列表。类似的东西:
第1单元:
class Move(object): pass
第2单元:
from module1 import Move
class Walk(Move): pass
主要剧本:
from module1 import *
from module2 import *
print Move.__subclasses__()
如果没有这两个导入行, main 将不返回任何子类。这似乎是一种预期的行为。
我希望将来能够添加更多的移动模块,而无需修改现有的源代码。
我正在考虑发现和导入给定目录中的所有python文件,类似于此处所做的:Python __subclasses__() not listing subclasses
这种任务有更简洁的方法吗?
答案 0 :(得分:3)
没有导入子类,python无法知道它们。
我们在一个项目中使用的解决方案最终完成了您的要求,即使用entry_points。然后加载通过入口点定义的类。
入口点定义:
module.movements =
Swim = othe_module:Swim
Run = other_module:Run
加载入口点:
def load_registred_entry_points(group):
for ep in pkg_resources.iter_entry_points(group=group):
ep.load()
load_registred_entry_points('module.movements')
当然,您必须在致电load_registred_entry_points
之前致电Move.__subclasses__()
。