ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

实现单例的四种实现方法

2019-05-04 13:52:22  阅读:128  来源: 互联网

标签:__ .__ 实现 SingleMeta instance def 单例 四种 cls


# <单例>
# Singleton
#
# 单例:即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间
# 如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了
#
#     实现原理,为了节省空间,结合需求让同一个类多次实例化后结果指向同一个对象
#     可理解为开关,一次进入后更改 instance的状态

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

<< 1.类方法实现 >>

class Singleton:
    __instance = None
    def change_instance(cls):
        if not cls.__instance:
            cls.__instance = cls()
        return cls.__instance

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

<< 2.装饰器实现 >>

def outer(fn):
    _instance = None
    def inner(*args, **kwargs):
        nonlocal _instance
        if _instance == None:
            _instance = fn(*args, **kwargs)
        return _instance
    return inner

@outer
class Music:
    pass

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

<< 3.元类方法实现 >>

class SingleMeta(type):
    __instance = None
    def __call__(cls, *args, **kwargs):
        if SingleMeta.__instance == None:
            SingleMeta.__instance = object.__new__(cls) # {}
            cls.__init__(SingleMeta.__instance, *args, **kwargs)
            print(SingleMeta.__instance.__dict__) # {} {'name': 'egon'}
        return SingleMeta.__instance

class Songs(metaclass=SingleMeta):
    def __init__(self):
        self.name = 'egon'
    pass

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

<< 4.反射方法实现 >>

class Singleton(object):
  def __new__(cls):
    if not hasattr(cls, 'instance'):
      cls.instance = super().__new__(cls)
    return cls.instance

+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+

 

标签:__,.__,实现,SingleMeta,instance,def,单例,四种,cls
来源: https://www.cnblogs.com/max404/p/10808298.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有