zoukankan      html  css  js  c++  java
  • 单例模式

    单例模式

    什么是单例模式

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

    为什么用单例模式

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

    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>
    
  • 相关阅读:
    unzip解压3G或者4G以上文件失败的解决方法
    zencart批量删除无图片产品
    zencart后台管理中选项名称和选项内容和属性控制页面出错解决办法 WARNING: An Error occurred, please refresh the page and try again
    在线随机密码生成工具
    zencart更改css按钮的宽度css buttons
    IE8"HTML Parsing Error:Unable to modify the parent container element before the child element is closed"错误
    css改变背景透明度
    phpMyAdmin出现Fatal error: Maximum execution time of 300 seconds
    da面板修改SSH端口号
    原生js三级联动
  • 原文地址:https://www.cnblogs.com/xiongchao0823/p/11461291.html
Copyright © 2011-2022 走看看