两个有关系的班级的最佳实践

时间:2014-07-23 11:02:21

标签: python design-patterns

我已经习惯了Python的打包机制,并努力了解如何避免循环导入。似乎很难开发一个基于类的模型,它具有类之间的关系,而不会影响循环依赖问题。

我对有许多课程和关系的情况感兴趣,但将其简化为一种简单的形式:

如果我有两个类A和B,它们之间有多对多的关系,以及方法A.getRelatedBs()和B.getRelatedAs(),那么将代码打包到模块和包中的最佳方法是什么?

将它们放入一次模块的解决方案可能适用于这种简单的情况,但是当有更多的类和关系时,它们不能大规模地工作。

这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

我唯一一次遇到与循环依赖问题发生冲突是在一个类似的项目中,有许多小模块都在一起工作。答案是不要将导入模块中的任何名称导入当前模块名称空间,而是使用对其他模块的完全限定引用。

所以,而不是:

from foo import Foo,Foobar
from bar import Bar,Barbaz

class Zuul(Foo):
    def do_something(self):
        self.bar = Bar()
        self.baz = Barbaz()

请改为:

import foo 
import bar 

class Zuul(foo.Foo):
    def do_something(self):
        self.bar = bar.Bar()
        self.baz = bar.Barbaz()

Python尝试通过仅导入每个模块一次来解决循环导入问题。但是,如果您将这些导入的模块中的名称分配到您的模块中,那么它必须尝试遵守订单,这对于循环导入是不可能的。使用完全限定名称似乎回避了这个问题。它打字更多,但更安全。