【问题标题】:solving cyclic dependency with python inheritance用python继承解决循环依赖
【发布时间】:2017-10-27 15:06:16
【问题描述】:

在 python 中使用 OOP 'State' 模式导致我遇到了这个依赖问题:
StateAStateBStateC 是实现相同方法 event1 的 3 个状态。
StateBStateA 继承其行为。

文件 a.py

#from b import StateB
from c import StateC

class StateA(object):
    def event1(self):
        return StateC()

print type(StateA().event1())

文件 b.py:

import a
class StateB(a.StateA):
    def event1(self):
        return self

文件 c.py:

class StateC(object):
    def event1(self):
        return self

只要我在a.py 中不需要StateB,就可以。但是如果我想在StateA 中使用StateB 类型呢?
导入StateB(参见a.py 中的第一行注释)会导致此循环依赖错误:

ImportError: cannot import name StateB

【问题讨论】:

  • 您可以尝试进行本地导入(在某些特定方法中),而不是在文件顶部导入它。
  • 如果更改文件 b 的全局导入会发生什么?
  • 如果我在方法 StateA.event1() 中移动文件 b 上的全局导入,则会出现同样的错误

标签: python oop circular-dependency state-pattern


【解决方案1】:

循环依赖是一个与代码设计相关的问题。在实践中,您可能只能在组织不良的代码中遇到这种情况。尝试重构您的代码以解决此问题。

另一种方法(我不建议您这样做,仅供参考)是模块级导入之外的导入,但您应该避免这种方法。

【讨论】:

  • 在应用“状态”模式时通常需要循环依赖,因为状态之间可能存在转换循环。
【解决方案2】:

由于您的类是紧密耦合的,我会将它们放在同一个模块中:

文件 my_state.py

class StateA(object):
    def event1(self):
        return StateC()


class StateB(StateA):
    def event1(self):
        return self


class StateC(object):
    def event1(self):
        return self


print(type(StateA().event1()))

【讨论】:

  • 这肯定会有所帮助,但我的实际课程要大得多,如果可能的话,我想将它们保存在单独的文件中。
  • 如果它们那么大,那么您可能需要将它们拆分并提取一些函数/类,然后可以将它们放入单独的模块中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
相关资源
最近更新 更多