【问题标题】:How to create a singleton?如何创建单例?
【发布时间】:2016-07-14 07:27:23
【问题描述】:

我想知道这种创建单例的方法是否正确。

my_class.py

class MyClass(object):
    def a_method(self):
        print("Hello World")
    ...

MY_CLASS_SINGLETON = MyClass()

另一个模块:

from my_class import MY_CLASS_SINGLETON

if __name__ == "__main__":
    MY_CLASS_SINGLETON.a_method()

所以这段代码对我有用,但我想知道垃圾收集器是否可以在 MY_CLASS_SINGLETON 实例被任何其他模块使用之前销毁它,因为最后它只是 my_class.py 中的一个临时变量模块。

【问题讨论】:

  • 它不是一个“临时变量”。这是在您的模块中定义的名称。 Python 也不会垃圾收集 MyClass,即使这也只是你模块中的一个命名对象。
  • 好吧,我不知道范围。关于“单例”,我确实可以创建更多实例,但就我而言,我不担心这一点。谢谢你的澄清:) 编辑:这个答案的一部分不是给你的,而是给@AnnetteC的,很抱歉这个错误。

标签: python import scope singleton


【解决方案1】:

我会假设你的实现不是一个保存单例,因为你可以轻松地创建 MyClass 的新实例。单例应该通过自己持有这个实例并只返回这个实例来避免这种情况——你的实例在类之外。 (但我自己是 Python 新手,而且我只是维护程序编写的 Python 代码。)

但是你看过here吗?

【讨论】:

  • 感谢您的链接。我已经看过它,但与我的想法相比,我发现它“太复杂了”(当然,为了我的需要)。关于能够创建多个实例,这对我来说没问题。谢谢。
  • 但是您所做的并不是实现单例模式。你只提供一个常数。可能对您的用例没问题,但如果其他人依赖您的代码并认为它​​是单例,则可能会导致问题。请看一下单例模式的想法。
  • 你是对的,我只是使用了错误的名称'singleton'。我对单例模式唯一想要的就是能够从任何地方访问同一个实例。
猜你喜欢
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多