列出来自不同文件的子类

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

有没有更干净的方法来完成这样的任务?

bee*_*ezz 3

如果不导入子类,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__()