我认为你的例子不太合适。在第二个代码片段中,您仍然(大概)在处理类(Model和View),,所以这段代码对我来说有点奇怪:from Model import Model
from View import View
class Controller
def some_function(self):
# How are you calling the method on the class and not the instance?
return Model.add_things(1, 2)
您必须执行类似return Model().add_things(1, 2)的操作,才能从中获取调用add_things方法的实例(除非函数用classmethod修饰)。但是,那没有任何意义,我敢说你可能不是这个意思。实际上,您所要求的是在构造函数中初始化对象与使用全局声明实例之间的区别,因此类似于:
^{pr2}$
回到问题…
为了回答你,我首先要让你意识到你真正在问什么。重点是从外部导入您的Model或{}与在相同模块中定义它们相比,没有任何错误或有争议的,因此询问这一点没有多大意义;事实是,这实际上取决于您的程序结构,更一般地说,你的项目有多大。越大、越复杂,这些类或类集合就越不可能在同一个模块中混合。它们很快就会被分成不同的模块。在
所以,就我所知,你真正的问题是,是否最好在你的Model或{}的构造函数中初始化一个Model或{}对象,还是将它们用作可以从Controller类调用的全局实例。坦率地说,我认为您真正要问的是类似于全局实例模式的东西(例如,类似于Singleton类的东西)。在
您还没有明确使用术语Singleton,但是您需要一种方法来使用一个类的全局声明的实例,这很像您要问的问题。在
您可以阅读它的陷阱here、here或here。在
为了引用原始示例,对于代码层次结构中较低的对象,最好使用以下方法(在整个程序中获得单个实例):class SubController
def __init__(self, modelobject, viewobject):
self.view = viewobject
self.model = modelobject
换言之,它与一个单例没有什么不同,因为您实际上是在使用一个单个实例,如果这确实是您需要的话。但是,它不是通过声明一个全局实例(这将引入耦合和链接文章中讨论的许多其他问题),而是通过让类通过调用上下文获取其依赖项(这有相当大的优势)。因此,您可以通过构造函数方法直接传递Model和{}对象,而不是直接在类中实例化它们(如您的示例中)或使用全局声明的变量获取它们。在
当然,您总是有main类或函数,在这里实例化这些对象并从那里传递出去。这种方法的好处是以后会更加灵活!在