【发布时间】:2017-11-04 05:46:22
【问题描述】:
我目前正在开发一个模块,该模块允许用户通过创建任务对象的实例(我的模块提供一个任务类)来构建任意任务网络模型(用于离散事件模拟)。除其他外,任务包含描述其完成效果的逻辑,例如不同任务的启动。通过这种方式,任务类的一个实例可以引用一个或多个其他实例,具有循环引用/相互递归的可能性。
这是我的代码的一个极其简化的版本:
TaskModule.py
class Task(object):
def __init__(self, name, effect):
self.name = name
self.effect = effect
def execute(task):
task.effect()
TaskTest.py
task1 = task("Do the first thing", execute(task2))
task2 = task("Do the second thing", execute(task3))
task3 = task("Do the third thing", execute(task1))
这个实现的问题是我在定义之前引用了task2和task3。如果我可以排除循环引用,那将不会是世界末日——这只是重新安排对象实例化顺序的问题——但我相信我应该适应这种可能性。我已经考虑了几个潜在的解决方法——大多数会涉及要求用户间接引用任务(即通过一些唯一的标识符值)——但我想知道是否有更优雅的解决方案来解决这个问题,它涉及一种巧妙的抽象形式。
确保实例化任务/生成任务网络(如 TaskTest.py 中所示)的过程尽可能简单易行是该项目的首要任务,因为这是我模块的用户将花费的他们大部分时间都在做。
我尝试搜索,但似乎大多数关于相互递归/循环引用主题的问题都与函数或类有关,而不是实例。
【问题讨论】:
-
你能把你的问题说得更清楚些吗?
-
基本上,我怎样才能允许用户以最简洁的方式创建具有交叉依赖关系的任务实例?如果可能,每个任务使用一行代码,如 TaskTest.py 中所示。
标签: python cyclic-reference mutual-recursion cyclic-dependency forward-reference