• 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( )

  • 相关阅读:
    mac 监控文件变化并重启php
    关闭某个命令的进程
    debian 添加永久环境变量方法
    debian swoole环境
    swoole 编程环境安装
    计算机网络知识笔记
    Mac 配置 php-fpm
    存储过程 利用游标 解决复制业务
    ubuntu 宝塔安装一条龙服务
    项目重零开始搭建
  • 原文地址:https://www.cnblogs.com/zhaochangbo/p/7687242.html
Copyright © 2020-2023  润新知