在python中使用单例模式的代码
使用__new__ 创建单例模式
class A():
# 类属性 用来记录当前创建的类对象的引用地址
instance = None
def __new__(cls, *args, **kwargs):
# 判断类属性是否为None,如果是第一次执行则为None
if cls.instance is None :
# 调用父类方法 创建一个内存空间
cls.instance = super().__new__(cls)
# 如果不是None ,返回当前的实例
return cls.instance
def __init__(self):
print("初始化...")
# 调用。单例模式两个对象的地址是一样的
a = A()
print(a)
b = A()
print(b)
# 输出内容
'''
初始化...
<__main__.A object at 0x0000026C430207D0>
初始化...
<__main__.A object at 0x0000026C430207D0>
'''
初始化方法只执行一次
class B():
# 类属性 用来记录当前创建的类对象的引用地址
instance = None
# 用于记录init函数执行次数的属性
init_flag = False
def __new__(cls, *args, **kwargs):
# 判断类属性是否为None,如果是第一次执行则为None
if cls.instance is None :
# 调用父类方法 创建一个内存空间
cls.instance = super().__new__(cls)
# 如果不是None ,返回当前的实例
return cls.instance
def __init__(self):
''' 如果是单例模式,init也只执行一次 '''
# 判断是否是第一次执行
if B.init_flag :
return
# 执行初始化
print("初始化...")
B.init_flag = True
#调用。
a = B()
print(a)
b = B()
print(b)
# 输出内容
'''
初始化...
<__main__.B object at 0x0000026C43021410>
<__main__.B object at 0x0000026C43021410>
'''
通过类方法创建单例模式
'''
通过类方法创建单例模式
'''
class A(object):
instance = None
@classmethod
def get_instance(cls):
if A.instance is None:
A.instance = object.__new__(cls)
return A.instance
# 两个对象的地址是一致的
a = A.get_instance()
b = A.get_instance()
print(a) # >>> <__main__.A object at 0x000001CFE708E490>
print(b) # >>> <__main__.A object at 0x000001CFE708E490>
使用装饰器创建单例模式
'''
使用装饰器创建单例模式
'''
def outer(fn):
_ins = {}
def inner():
if fn not in _ins:
_ins[fn] = fn()
return _ins[fn]
return inner
@outer
class A(object):
a = 1
a = A()
b = A()
print(a) # >>> <__main__.A object at 0x0000024D7109E790>
print(b) # >>> <__main__.A object at 0x0000024D7109E790>
模块导入单例模式
''' Test文件中定义A类 '''
class A(object):
pass
a = A()
print(a)
''' Test2中导入Test文件 '''
from Test import A
from Test import A
# >>> 导入两次 只输出一次a的内存地址
使用 hasattr() 实现单例模式
'''
hasattr() 用于判断对象是否包含对应的属性
'''
class A(object):
b = 2
def test(self):
print("test")
print(hasattr(A(),'b')) # >>> True
print(hasattr(A(),'test')) # >>> True
print(hasattr(A(),'a')) # >>> False
'''
使用 hasattr() 实现单例模式
'''
class B:
def __init__(self,name):
self.name = name
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
# instance 不存在时 执行
cls.instance = super().__new__(cls) # 调用父类创建实例
return cls.instance
a = B("张三")
b = B("李四")
print(a,a.name) # >>> <__main__.B object at 0x00000213D983FB10> 李四
print(b,b.name) # >>> <__main__.B object at 0x00000213D983FB10> 李四
评论 (0)