Eka*_* AW 5 python module subclass
让我们考虑一个应用程序,其中有一个基类 Move 及其变体 Walk 和 Run。我想将它们分成不同的类。我还希望能够从基类中获取可能的动作列表。就像是:
模块 1:
class Move(object): pass
Run Code Online (Sandbox Code Playgroud)
模块 2:
from module1 import Move
class Walk(Move): pass
Run Code Online (Sandbox Code Playgroud)
主要脚本:
from module1 import *
from module2 import *
print Move.__subclasses__()
Run Code Online (Sandbox Code Playgroud)
如果没有这两个导入行,main将不会返回任何子类。这似乎是预期的行为。
我希望将来能够添加更多的运动模块,而无需修改现有的源代码。
我正在考虑发现并导入给定目录中的所有 python 文件,类似于此处所做的操作:Python __subclasses__() notlisting subclasses
有没有更干净的方法来完成这样的任务?
如果不导入子类,Python 就无法了解它们。
我们在一个项目中使用的解决方案最终完全满足了您的要求,即使用entry_points。然后加载通过入口点定义的类。
入口点定义:
module.movements =
Swim = othe_module:Swim
Run = other_module:Run
Run Code Online (Sandbox Code Playgroud)
加载入口点:
def load_registred_entry_points(group):
for ep in pkg_resources.iter_entry_points(group=group):
ep.load()
load_registred_entry_points('module.movements')
Run Code Online (Sandbox Code Playgroud)
当然,load_registred_entry_points打电话之前一定要先打电话Move.__subclasses__()。