Python 具有关系的两个类的最佳实践
我已经习惯了Python的打包机制,并且正在努力了解如何避免循环导入。似乎很难开发一个基于类的模型,其中包含类之间的关系,而不涉及循环依赖性问题 我对有许多类和关系的情况很感兴趣,但将其归结为一种简单的形式: 如果我有两个类A和B,它们之间有多对多关系,以及方法A.getRelatedBs()和B.getRelatedAs(),那么将代码打包到模块和包中的最佳方法是什么 将它们放入一次模块的解决方案可能适用于这种简单的情况,但不适用于大规模的情况,因为此时将有更多的类和关系Python 具有关系的两个类的最佳实践,python,design-patterns,Python,Design Patterns,我已经习惯了Python的打包机制,并且正在努力了解如何避免循环导入。似乎很难开发一个基于类的模型,其中包含类之间的关系,而不涉及循环依赖性问题 我对有许多类和关系的情况很感兴趣,但将其归结为一种简单的形式: 如果我有两个类A和B,它们之间有多对多关系,以及方法A.getRelatedBs()和B.getRelatedAs(),那么将代码打包到模块和包中的最佳方法是什么 将它们放入一次模块的解决方案可能适用于这种简单的情况,但不适用于大规模的情况,因为此时将有更多的类和关系 这里的最佳实践是什么
这里的最佳实践是什么?我唯一一次碰到循环依赖性问题是在一个类似的项目中,有许多小模块一起工作。答案是不将任何名称从导入的模块导入当前模块名称空间,而是使用对其他模块的完全限定引用 因此,不是:
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试图通过只导入每个模块一次来绕过循环导入问题。但是,如果您将这些导入的模块中的名称分配到您的模块中,那么它必须尝试遵守一个顺序,而对于循环导入,它不能这样做。使用完全限定名似乎回避了这个问题。它更容易输入,但更安全。避免依赖关系?如果您有太多的依赖项,以至于无法将它们全部放在一个模块中,那么您的设计有问题……如果一个问题空间由具有相互关系的N个类最佳覆盖,那么所有N个类都需要放在一个模块中?我不这么认为。是的,只要
N
足够小(例如2,3,4)。如果N很大,那么首先编写类的方式就有问题,所以应该重构它们,获得2组或更多的类,其中每个组只有2,3,4个类。我认为问题太广泛了。这完全取决于如果A和B进入一个模块、两个模块,甚至可能是完全不同的包,它们在语义上的关系有多密切。