【问题标题】:List subclasses from different files列出来自不同文件的子类
【发布时间】:2015-09-01 15:51:33
【问题描述】:

让我们考虑一个应用程序,其中我有一个基类 Move 及其变体 Walk and Run。我想把它们分成不同的类。我还希望能够从基类中获取可能的动作列表。比如:

模块 1:

class Move(object): pass

模块 2:

from module1 import Move
class Walk(Move): pass

主脚本:

from module1 import *
from module2 import *
print Move.__subclasses__()

如果没有这两个导入行,ma​​in 将不会返回任何子类。这似乎是一种预期行为。

我希望将来能够在不修改现有源代码的情况下添加更多运动模块。

我正在考虑发现并导入给定目录中的所有 python 文件,类似于此处所做的:Python __subclasses__() not listing subclasses

这样的任务有更清洁的方法吗?

【问题讨论】:

  • 一个反问句:假设我来了,看看你的 Move 类,fork 你的代码和子类 Move(我们称之为子类 Swim)。您的Move.__subclasses__() 了解 Swim 是否有意义?
  • 我们今天没有要求为运动提供多层次的继承。该软件的开发人员指南将声明所有运动类都必须从 Move 继承。
    将来,如果我们发现需要额外的层(移动->游泳->(蝴蝶,蛙泳),我们计划建立一个类似于stackoverflow.com/questions/3862310/…的递归子类搜索,现在我正在重新考虑所有这样,循环遍历所有模块将是相同的。
  • 事实上,我不确定我是否很好地理解了您的示例。是的,任何特定的动作都对 Move 有意义。

标签: python module subclass


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2012-09-13
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多