Python 为什么我在不同的模块中得到相同单例的不同实例?

Python 为什么我在不同的模块中得到相同单例的不同实例?,python,module,singleton,instances,Python,Module,Singleton,Instances,我有两个文件打印一个单例实例,但我得到两个不同的实例 我使用的是来自的单例代码 以下是文件: test.py 无标题 …下面是python test.py的输出 <__main__.A object at 0xaea270> <test.A object at 0xaea3f0> 有人能给我解释一下是什么(显然是在模块层面上)导致了这种行为吗?我不知道为什么你需要单例,但只要看看你指出的“单例混合”就让我想起了一封旧的笑话链电子邮件,其中显示了程序员(d)进化的各个

我有两个文件打印一个单例实例,但我得到两个不同的实例

我使用的是来自的单例代码

以下是文件:

test.py 无标题 …下面是
python test.py的输出

<__main__.A object at 0xaea270>
<test.A object at 0xaea3f0>


有人能给我解释一下是什么(显然是在模块层面上)导致了这种行为吗?

我不知道为什么你需要单例,但只要看看你指出的“单例混合”就让我想起了一封旧的笑话链电子邮件,其中显示了程序员(d)进化的各个阶段,有各种hello world程序的示例。在这封电子邮件中,最糟糕的是“企业级高级程序”,它开发了一个客户机-服务器系统,实现了各种模式,以便编写“Hello World”

在同一文本中,最重要的是“黑客大师”,它用一行sngle实现了Hello world: 回声你好世界

所以, 最有可能的情况是,您所需要的只是一个使用该类的类,而不是它的实例。无论出于何种目的,它都会表现得像一个单身汉。如果要使舒尔it不被实例化,只需在新方法上引发一个异常:

class SimpleSingleton(object):
    @classmethod
    def my_singleton_method(cls,):
         pass
    def __new__(cls):
         raise TypeError("Cannot be instantiated")

我不知道你为什么需要单例,但只要看看你指出的“单例混合”,我就会想起一封古老的笑话链电子邮件,其中显示了程序员(d)进化的各个阶段,以及hello world程序的各种示例。在这封电子邮件中,最糟糕的是“企业级高级程序”,它开发了一个客户机-服务器系统,实现了各种模式,以便编写“Hello World”

在同一文本中,最重要的是“黑客大师”,它用一行sngle实现了Hello world: 回声你好世界

所以, 最有可能的情况是,您所需要的只是一个使用该类的类,而不是它的实例。无论出于何种目的,它都会表现得像一个单身汉。如果要使舒尔it不被实例化,只需在新方法上引发一个异常:

class SimpleSingleton(object):
    @classmethod
    def my_singleton_method(cls,):
         pass
    def __new__(cls):
         raise TypeError("Cannot be instantiated")

得到两个单例的原因是由于模块的导入方式。从命令行执行test.py时,它不是
test
,而是
\uuuuuu main\uuuuu
。在
\uuuu main\uuuuu
名称下,将一个条目添加到
sys.modules
,然后执行。当无标题导入测试时,检查
sys.modules
,未找到名为
test
的模块,因此再次执行test.py以导入它。结果,
a
的类定义被执行两次,产生两个不同的类。因此,单例实现将它们视为不同的,并生成两个实例。

获得两个单例的原因在于模块的导入方式。从命令行执行test.py时,它不是
test
,而是
\uuuuuu main\uuuuu
。在
\uuuu main\uuuuu
名称下,将一个条目添加到
sys.modules
,然后执行。当无标题导入测试时,检查
sys.modules
,未找到名为
test
的模块,因此再次执行test.py以导入它。结果,
a
的类定义被执行两次,产生两个不同的类。因此,单例实现将它们视为不同的,并生成两个实例。

test2模块中有什么?test2是否从
test.py
导入
A
?在
test2
模块中有什么?test2是否从
test.py
导入
A
?当然,我可以使用静态类(我很欣赏这个建议),但这不是真正的问题。当然,我可以使用静态类(我很欣赏这个建议),但这不是真正的问题。太棒了!谢谢你,内德!这正是我想要的解释。我觉得有点奇怪。因此,一个Python程序,其中另一个模块通过它的modulename
m
导入
\uuu主
模块,
m
将被导入两次。因此,根据@jsbueno的建议,使用classmethods创建静态类是一个没有实际意义的问题。防止出现此问题的最佳方法是尽可能多地将代码保留在主文件之外,或者显式传递对象,而不是重新导入主文件。太棒了!谢谢你,内德!这正是我想要的解释。我觉得有点奇怪。因此,一个Python程序,其中另一个模块通过它的modulename
m
导入
\uuu主
模块,
m
将被导入两次。因此,根据@jsbueno的建议,使用classmethods创建静态类是一个没有实际意义的问题。防止出现此问题的最佳方法是尽可能多地将代码保留在主文件之外,或者显式传递对象,而不是重新导入主文件。
class SimpleSingleton(object):
    @classmethod
    def my_singleton_method(cls,):
         pass
    def __new__(cls):
         raise TypeError("Cannot be instantiated")