Python中的单例模式

1.理解单例模式:

单例模式是一种常见的软件设置模式,在它的核心结构中只包含一个被称为单例类的特殊类,

通过单例模式可以保证系统中的一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

如果希望在系统中某个对象只能存在一个,单例模式是最好的解决方案.

  • 某个类只能有一个实例

  • 它必须创建这个实例

  • 它必须自行向整个系统提供这个实例

  • 但是从具体角度实现来说的话,又可以分为三点

    • 单例模式的类只能提供私有的构造函数

    • 类定义中含有一个该类的静态私有对象

    • 该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象

总结:单利模式存在的目的是保证当前内存中仅存在单个实例,避免内存浪费!

2.实现单例模式的方法:

  • 使用模块

  • #test.py
    class MyClass(object):
        def foo(self):
            print('MyClass.foo')
    my_class_obj=MyClass()
    将上面的代码保存在文件 test.py 中,然后这样使用:
    
    将上面的代码保存在test.py 文件中就可以
    from .test import my_class_obj
    my_class_obj.foo()
    

      

  • 使用 __new__

  • class Teacher:
          flag = None
         def __new__(cls, *args, **kwargs):
               if cls.flag is None:
                       cls.flag = object.__new__(cls) # 这一句话只能走一次
               return cls.flag
          def __init__(self,name):
               self.name = name
    #保证线程安全添加锁(推荐使用)
    class
    Teacher: from threading import Lock lock = Lock() flag = None def __new__(cls, *args, **kwargs): with cls.lock: if cls.flag is None: cls.flag = object.__new__(cls) # 这一句话只能走一次 return cls.flag def __init__(self,name): self.name = name

     

  • 使用装饰器(decorator)

  • from functools import wraps
     
     
    def singleton(cls):
        instances = {}
     
        @wraps(cls)
        def getinstance(*args, **kwargs):
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
            return instances[cls]
     
        return getinstance
     
     
    @singleton
    class MyClass(object):
        a = 1
    

      

  • 使用元类(metaclass)

  • class Singleton(type):
        _instances = {}
     
        def __call__(cls, *args, **kwargs):
            if cls not in cls._instances:
                cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
            return cls._instances[cls]
     
     
    # Python2
    # class MyClass(object):
    #     __metaclass__ = Singleton
     
    # Python3
    class MyClass(metaclass=Singleton):
       pass
    

      

 

转载于:https://www.cnblogs.com/changtao/p/10732737.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值