如何解决Python中的循环依赖问题?
我在Python中遇到了两个类之间的循环依赖问题。现在我不太确定该如何解决这个循环依赖。
这两个类应该放在各自的模块里。但目前因为它们之间的依赖关系,我只能把这两个类放在同一个模块里。
举个例子:
- 有两个类,它们互相依赖,分别是
Scheduler
和SystemCall
。
class Scheduler:
def run(self):
while self.task_map:
task = self.ready_queue.get()
result = task.run()
if isinstance(result, SystemCall):
result.set_task_and_scheduler(task, self)
class SystemCall:
def set_task_and_scheduler(self, task: Task, scheduler: Scheduler) -> None:
if not is instance(scheduler, Scheduler):
print(f'scheduler must be of type Scheduler')
ready_queue
可以存放不同的任务,其中一些任务是 SystemCall
类型的。如果出现了一个系统调用,就需要调用一个函数来设置关于发起任务和调度器的信息,这个调度器是作为回调机制的一部分使用的。
在其他面向对象的编程语言中,可以通过提前声明类来解决这个问题。但Python没有这种方式。
另一个可能的解决办法是重构代码,去掉这种相互依赖的关系。不过我现在还没找到简单的方法来做到这一点。
1 个回答
5
你可以使用一种叫“接口”的方法:
# Interface
class Scheduler:
def run(self):
pass
# Implementing class that references SystemCall
class SchedulerImpl(Scheduler):
def run(self):
while self.task_map:
task = self.ready_queue.get()
result = task.run()
if isinstance(result, SystemCall):
result.set_task_and_scheduler(task, self)
# Uses the Scheduler interface
class SystemCall:
def set_task_and_scheduler(self, task: Task, scheduler: Scheduler) -> None:
if not is instance(scheduler, Scheduler):
print(f'scheduler must be of type Scheduler')