Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有关系的两个类的最佳实践_Python_Design Patterns - Fatal编程技术网

Python 具有关系的两个类的最佳实践

Python 具有关系的两个类的最佳实践,python,design-patterns,Python,Design Patterns,我已经习惯了Python的打包机制,并且正在努力了解如何避免循环导入。似乎很难开发一个基于类的模型,其中包含类之间的关系,而不涉及循环依赖性问题 我对有许多类和关系的情况很感兴趣,但将其归结为一种简单的形式: 如果我有两个类A和B,它们之间有多对多关系,以及方法A.getRelatedBs()和B.getRelatedAs(),那么将代码打包到模块和包中的最佳方法是什么 将它们放入一次模块的解决方案可能适用于这种简单的情况,但不适用于大规模的情况,因为此时将有更多的类和关系 这里的最佳实践是什么

我已经习惯了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进入一个模块、两个模块,甚至可能是完全不同的包,它们在语义上的关系有多密切。