python中的单例

  单例模式是一种常用的软件设计模式,核心结构是只包含一个被称为单例类的特殊类,通过单例模式可以保证系统中只有一个实例而且该实例易于外界访问,从而控制实例数量来保证系统资源的节省。可以用于打印任务,以及类中实例只有一个的情况下。单例模式设计的类只能实例,单例的四种方法要了解,类的call方法要能默写。

 

1 使用new 方法, 注意的是多线程无法支持这种方法创建的单例,因此要加锁,第一次判断是否单例对象,第二次判断是解决多线程下的问题。 推荐使用

import threading
class Singleton(object):
    lock = threading.Lock()
    def __new__(cls,*args,**kw):
        if not hasattr(cls,'_instance'):
            with Singleton.lock:
                if not hasattr(Singleton, "_instance"):
                    cls._instance = object.__new__(cls)
        return cls._instance
class MyClass(Singleton):
    print(1)
MyClass()

 

2 共享属性

class Dic(object):
    _state = {}
    def __new__(cls,*args,**kw):
        obj = super().__new__(cls,*args,**kw)
        obj.__dict__ = cls._state
        return obj
class MyClass(Dic):
    pass
MyClass()

 

3 装饰器

def Singleton(cls):
    state = {}
    def wapper(*args,**kw):
        if cls not in state:
            state[cls] = cls(*args,**kw)
        return state
    return wapper
@singleton
class My_Singleton:
    pass

 

4 import

# Singleton.py
class My_Singleton():
    def foo(self):
        pass
# use.py
from Singleton import My_Singleton
My_Singleton.foo()

 

5 call

class My_Singleton(type):
    def __call__(cls,*args,**kw):
        if not hasattr(cls,'_instance'):
            cls._instance = super().__call__(*args,**kw)
        return cls._instance
class My_Class(metaclass=My_Singleton):
    def __init__(self, name):
        self.name = name
print(My_Class('123'))
print(My_Class('456'))

 

转载于:https://www.cnblogs.com/wang-kai-1994/p/10374954.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值