我目前正在开发一个模块,该模块允许用户通过创建任务对象的实例(我的模块提供一个任务类)来构建任意任务网络模型(用于离散事件模拟)。除其他外,任务包含描述其完成效果的逻辑,例如不同任务的启动。这样,任务类的一个实例可以引用一个或多个其他实例,具有循环引用/相互递归的可能性。
这是我的代码的一个极其简化的版本:
任务模块.py
class Task(object):
def __init__(self, name, effect):
self.name = name
self.effect = effect
def execute(task):
task.effect()
任务测试.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 中所示)尽可能简单易行是该项目的首要任务,因为这是我模块的用户将花费的大部分时间时间做。
我尝试搜索,但似乎大多数关于相互递归/循环引用主题的问题都涉及函数或类而不是实例。