• 初识单例模式


    单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类始终只有一个实例存在

    我们都知道,每一次实例化一个对象,它们之间都是独立的。但有些应用场景:比如,全局就希望有一个实体存在,作为配置项等,也就是希望牵一发而动全身。

    单例模式正好能解决。

    单例模式实现一:__new__

    class Singleton:
        _instance = None
        def __new__(cls, *args, **kwargs):
            if not cls._instance:    # 如果实例不存在
                cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)   
            return cls._instance     # 否则直接返回 cls._instance
    
    class Myclass(Singleton):
        pass
    
    mc1 = Myclass()
    mc2 = Myclass()
    print(id(mc1),id(mc2))

    >>>2316670072480 2316670072480 # 看,共用一个实例对象

    单例模式实现二:模块

    重点:模块只导入一次。因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

    因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

    mysingleton.py

    class My_Singleton(object):
        def foo(self):
            print("foo")
    
    
    my_singleton = My_Singleton()  # 实例化一个对象

    单例模式.py

    from mysingleton import my_singleton  # 导入模块中的实例对象
    print(id(my_singleton))
    
    from mysingleton import my_singleton 
    print(id(my_singleton))
    
    >>>2688065271400     #  共用一个实例对象
       2688065271400    

    区分:

    from mysingleton import My_Singleton   # 导入模块中的
    
    mc1 = My_Singleton()
    mc2 = My_Singleton()
    
    print(id(mc1))
    print(id(mc2))

    前面导入模块的是一个实例对象,那这次导入的一个类,它们是否是一样的呢?

    答案:不一样!看清楚,前面,我们导入是一个实例对象,因为模块导入的特殊性,我们都是共用的一个实例对象。而这次导入的是,这样每次实例化时,都是独立的。

  • 相关阅读:
    如何使用git提交代码
    Eclipse升级ADT
    android学习:android开发常见技巧设置,提高开发效率
    Apache -Common-lang包使用
    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    Asp.Net MVC entity framework模型验证
    Activity启动模式
    http服务器交互get,put,post,delete等说明
    js模块化插件开发
    Android Asynchronous Http Client异步网络请求使用
  • 原文地址:https://www.cnblogs.com/ykgo/p/9437781.html
Copyright © 2020-2023  润新知