如果我有一个类的单个实例,最好将它全局化或作为构造函数中的参数传递?

时间:2016-05-22 19:40:12

标签: python

我在我的所有程序中都有一个类的实例(假设没有并发问题)。

最好有这样的事情:

def main():
    usefulClass = usefulClass()
    self.a = A(usefulClass)
    self.b = B(usefulClass)

class A/B:
     def __init__(self, usefulClass):
         self.usefulClass = usefulClass

     def method(self):
         self.usefulClass.whatever()

if __name__ == "__main__":
    main()

或者像这样:

usefulClass = usefulClass()

def main():
    self.a = A()
    self.b = B()

class A/B:
     def __init__(self):
         pass

     def method(self):
         usefulClass.whatever()

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:2)

第一个更好,因为它避免使用全局变量 - global variables can cause tons of headaches later on

例如,如果您在其他模块中意外修改了usefulClass该怎么办?很难找出出错的原因和原因。

答案 1 :(得分:2)

这取决于代码的大小。在你的小例子中,第一个解决方案肯定更好。因为全局变量基本上都是地狱。

但是,假设您只需要一次的对象是来自配置文件的数据,并且数百个其他对象可能会查询它。您不希望将配置对象传递给程序中的每个对象,也不想解析数百次配置。在这些情况下,配置被制作成Singleton。

说实话,Singleton是一个名字很好的全局变量。但如果你的程序太大,这是一个必要的恶魔 - 第一个解决方案会导致更多的问题,而不是它解决的问题。

所以,对于这个问题没有绝对的答案,所有这些都与模型化,大小和背景有关。