方式一:类内部实现
# import time
import threading
class Singleton(object):
instance = None # 静态字段/类变量
lock = threading.RLock()
def __init__(self, name):
'''初始化对象'''
self.name = name
def __new__(cls, *args, **kwargs):
'''
创建对象
'''
if cls.instance:
return cls.instance
with cls.lock:
if not cls.instance:
# time.sleep(0.2)
cls.instance = object.__new__(cls)
return cls.instance
print(Singleton('zze'))
print(Singleton('lcq'))
'''
<__main__.Singleton object at 0x01822FD0>
<__main__.Singleton object at 0x01822FD0>
'''
方式二:模块导入实现
首先约定单例的对象都在指定 py 文件中创建,我这里新建一个 singletons.py
文件内容如下:
class Foo(object):
pass
foo = Foo()
在其它 py 文件中直接从 singletons.py
中导入要使用的对象,被导入的都是同一个对象:
from singletons import foo
print(foo)
from singletons import foo
print(foo)
'''
<singletons.Foo object at 0x00332EC8>
<singletons.Foo object at 0x00332EC8>
'''
评论区