Python 5中实现单例模式的方法 与 初始化方法只执行一次

EN
EN
2023-04-03 / 0 评论 / 59 阅读 / 正在检测是否收录...

在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

评论 (0)

取消