• 单例模式


    单例模式

    什么是单例模式

    - 单例模式:基于某种方法实例化多次得到的实例就是同一个
    

    为什么用单例模式

    - 当实例化多次得到的对象中存放的属性都是一样的情况,应该将多个对象指向同一个内存,
    即同一个实例
    

    1.单例模式(类内部定义静态方法)

    name = 'xc'
    pwd = 123
    
    class Mysql:
    
        state = None  # 最先开辟的内存空间,用来实现单例模式,也就是相同的对象使用同一个内存空间
    	def __init__(self,name,pwd):  
            self.name = name
            self.pwd = pwd
        @classmethod  # 指定类方法
        def get_memory(cls):  # 定义类方法
            if not cls.state: # 如果类中的state没有值
                cls.state = cls(name,pwd) # 附上我们定义的默认值
            return cls.state    # 最后输出cls.state
    a1 = Mysql.get_memory()
    a2 = Mysql.get_memory()
    a3 = Mysql.get_memory()
    print(a1)
    print(a2)
    print(a3)
    打印 -->
        <__main__.Mysql object at 0x000001FA3E7924A8> 
        <__main__.Mysql object at 0x000001FA3E7924A8> 
        <__main__.Mysql object at 0x000001FA3E7924A8>
    a4 = Mysql('xc',123)
    打印 -->
        <__main__.Mysql object at 0x0000021394F1B470>
    
    

    2.单例模式(装饰器)

    # setting.py
    Name = 'xc'
    Age = 18
    
    def auth(cls):
        import setting
        cls.state = cls(setting.Name,setting.Age): # 定义一个默认值,也就是一个名称空间
        def inner(*args,**kwargs)
            if len(args) == 0 and len(kwargs) == 0:
                return cls.state
            return cls(*args,**kwargs)
            
         
        return inner
    @auth 
    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
            
    p1 = Foo()
    p2 = Foo()
    p3 = Foo()
    
    print(p1)
    print(p2)
    print(p3)    
    

    3.单例模式(元类)

    # setting.py
    Name = 'xc'
    Age = 18
    
    
    
    import setting
    class Mymeta(type):
        def __init__(self,class_name,class_bases,class_dic):
            self.state = self(setting.Name,setting.Age) # 使用类的__init__,重写一个self.state到类的名称空间中,也就是Foo的名称空间
            
        def __call__(self,*args,**kwargs):
            if len(args) == 0 and len(kwargs) == 0:
                return self.state
            obj = self.__new__(self)
            obj.__new__(*args,**kwargs)
            return obj  
    
    class Foo(metaclass = Mymeta):
        def __init__(self,name,age):
            self.name = name
            self.age = age
    

    4.单例模式(模块)

    - 模块是一个天然的单例
    
    # setting.py
    class Foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    s = Foo('xc',18)
    
    
    import setting.py
    s1 = setting.s
    s2 = setting.s
    s3 = setting.s1
    
    pring(s1)
    print(s2)
    print(s3)
    

    5.单例模式(不同值,同一个内存空间)

    class Foo:
        state = None
        def __init__(self,name,age):
            self.name = name
            self.age = age
        
        def __new__(cls,*args,**kwargs):
            if not cls.state:
                cls.state = object.__new__(cls)
            return cls.state
    
    
    f1 = Foo('xc',123)
    f2 = Foo('www',123)
    
    print(f1)
    print(f2)
    
    打印 -->
        -<__main__.Foo object at 0x000001EF71392400>
        -<__main__.Foo object at 0x000001EF71392400>
    
  • 相关阅读:
    400 Bad Request
    Django 中间件 阅读目录 初步了解 中间件 中间件的介绍 自定义中间件 process_template_response(用的比较少) 中间件的执行流程 中间件版登录验证
    关于python语言优化的一些思考
    从系统角度考虑性能优化 【被面试官吊打】从系统角度考虑性能优化 目录 什么是性能? 定义系统范围 重定义功能 关注价值 总结
    需求设计
    开源软件评选白热化,这些项目冲击 Top 5
    两个向量的outer product
    协同过滤算法中皮尔逊相关系数的计算 C++
    求向量间的点积
    string 类型的翻转
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11461291.html
Copyright © 2020-2023  润新知