• python单例模式


    单例模式:是指 一个类的实例从始至终只能被创建一次。

    1 模块导入的方式

    导入的模块中有实例化的对象,该对象就是单例模式。仅在模块导入的时候实例化一次,之后就可以使用该对象。

    如CRM中v1.py中实例化的site:

    site = MySite()   #实例化对象,在此就是 单例模式

    2 实例化先执行函数的方式

    class Foo:
        _instance = None
    
        def __init__(self):  # 2 实例化对象
            pass
    
        @classmethod
        def get_instance(cls):
            if cls._instance:
                return cls._instance # 4 再次执行函数的时候执行,返回的仍然是obj
            else:
                obj = cls()   # 1 下面执行的时候先执行这里,然后执行__init__
                cls._instance = obj # 3 对类属性_instance赋值
                return obj
    
    f1 = Foo.get_instance()
    f2 = Foo.get_instance()
    
    print(f1)
    print(f2)
    
    
    # <__main__.Foo object at 0x02EF55F0>
    # <__main__.Foo object at 0x02EF55F0>

    在单例模式中的__init__中传参数并调用参数

    class Foo:
        _instance = None
    
        def __init__(self,name):  # 2 实例化对象
            self.name = name  # 传入参数
    
        @classmethod
        def get_instance(cls,*args,**kwargs):  # 接收参数
            if cls._instance:
                return cls._instance # 4 再次执行函数的时候执行,返回的仍然是obj
            else:
                obj = cls(*args,**kwargs)   # 1 下面执行的时候先执行这里,然后执行__init__
                cls._instance = obj # 3 对类属性_instance赋值
                return obj
    
    f1 = Foo.get_instance("asdfasdf") # 实例化对象
    f2 = Foo.get_instance("zds")
    
    print(f1.name)  # 执行对象的方法
    print(f2.name)
    
    print(f1)
    print(f2)
    
    # asdfasdf
    # asdfasdf
    # <__main__.Foo object at 0x03364490>
    # <__main__.Foo object at 0x03364490>

    3 __new__ 的方式

    上面的方式调用的时候和普通的实例化不一致,通过__new__改造成与普通实例化一致的方式

    __new__是创建实例的方法,__init__是类创建实例后调用,所以__new__先执行

    #---------- 单例类定义 -------------
    
    class Foo(object):
        
        __instance = None
        
        @staticmethod
        def singletion():
            if Foo.__instance:
                return Foo.__instance
            else:
                Foo.__instance = Foo()
                return Foo.__instance
    
    
    
    #---------- 获取实例  ---------------
    
    obj = Foo.singletion()
    
    class Foo:
        _instance = None
    
        def __init__(self):
            pass
    
        def __new__(cls, *args, **kwargs):
            if cls._instance:
                return cls._instance
            else:
                # obj = super().__new__(cls,*args,**kwargs)
                obj = object.__new__(cls, *args, **kwargs)  # 所有的类都是object创建的
                cls._instance = obj
                return obj
    
    
    f1 = Foo()
    f2 = Foo()
    
    print(f1)
    print(f2)

    对于Python单例模式,创建对象时不能直接使用: obj = Foo( ),而应该调用特殊的方法: obj = Foo.singleton( )

  • 相关阅读:
    【HAOI2014】贴海报
    【HAOI2016】食物链
    【NOI2003】银河英雄传
    【HAOI2013】花卉节
    【BZOJ1702】[usaco2007margold]队列平衡
    【网络流24】餐巾
    洛谷 [P1265] 公路修建
    全排列与 康托展开
    洛谷 [P1403] 约数研究
    高精度模板
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7687242.html
Copyright © 2020-2023  润新知