我有一个单件.py,其代码如下:
from functools import wraps
def singleton(cls):
instances = {}
@wraps(cls)
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class OTConn():
def __init__(self):
self.conn = None
我有一个test01.py:
from app04 import singleton
ot_conn = singleton.OTConn()
ot_conn.conn = "a"
和test02.py
:
import singleton
ot_conn = singleton.OTConn()
print (ot_conn.conn) # there print: None
我在一个进程中运行test01.py
和test02.py
,但是ot_conn.conn
打印None
。你知道吗
编辑
我试着把代码改成:
@singleton
class OTConn():
conn = None
def __init__(self):
pass
还是不行。有朋友能帮我介绍一下单身汉的装修方法吗?你知道吗
编辑-2
装饰方法和我的一样。你知道吗
似乎您还不了解如何使用
singleton
装饰器。您错误地认为用singleton
装饰的类变成了singleton
的属性。它没有。你知道吗下面是一个如何工作的例子。请注意,我稍微修改了
singleton
的定义,以除去一些瑕疵。它只适用于python3。如果您需要在python3中使用这个decorator,则必须放回一些残羹剩饭。你知道吗Python的
is
操作符验证对象标识。assert a is b
确认a
和b
是同一个实例。你知道吗下面是如何验证它的工作方式是否更像您在测试代码中尝试执行的操作:
您的代码和我的代码之间最重要的区别是
singleton.OTConn
没有出现在我的代码中的任何地方。它不可能工作!(除非有一些代码您没有向我们展示,这使得它可以工作。)如何观察
singleton
正常工作的分步说明你所报告的行为,以及你一直拒绝确切描述你认为你是如何在一个进程中执行这段代码的,给人一种强烈的印象,你是在不同的进程中执行这段代码的。正如许多人向您指出的那样,在这种情况下,您的单例类不可能工作。你知道吗
在这里,我给你一个逐步的方法,如何观察
singleton
在多个模块中正常工作,而不是一个进程。你知道吗步骤1:创建一个目录(文件夹),您将在其中创建以下python源文件。你知道吗
步骤2:在步骤1中创建的目录中创建一个名为
singleton.py
的文件,其中包含以下代码:第3步:在同一目录中创建一个名为
theclass.py
的文件,其中包含代码步骤4:同样,在同一个目录中创建一个名为
client1.py
的文件,其中包含第五步:。。。还有一个名为
client2.py
的文件,包含步骤6:您需要的最后一个文件应该被称为
main.py
并包含第七步:执行
main.py
步骤8:观察输出
从输出中可以看出
TheClass
在两个独立的模块中实例化。你知道吗conn
属性以None
开头'XXXX'
会将其设置为两个实例。你知道吗'YYY'
,这一次使用其他实例这样做,再次更改两个实例。你知道吗不可避免的结论是
singleton
像广告宣传的那样工作。但这确实关键地依赖于两个实例在同一过程中。你知道吗相关问题 更多 >
编程相关推荐