• python基础之单例模式


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

    单例模式的要点三个:

      --某个类智能有一个实例

      --他必须自行创建这个实例

      --必须自行向整个系统提供这个实例

    在python中,我们可以用多种方法来实现单例模式:

    •   使用模块
    •        使用__new__
    •        使用装饰器(decorator)
    •         使用元类(metaclass)

    使用模块                                                                                                

    python的模块就是天然的单例模式

    class Myclass(object):
        def foo(self):
            print('Myclass.foo')
    my_class_obj=Myclass()
    fx.py
    from fx import my_class_obj
    
    my_class_obj.foo()

    使用__new__                                                                                         

    class Myclass(object):
        _instance =None
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance=super(Myclass, cls).__new__(cls,*args,**kwargs)
            return cls._instance
    #我们将类的实例和一个类变量_instance关联起来,如果cls._instance为None则创建实例,否者直接返回cls._instance
    class Herclass(Myclass):
        a=1
    
    one=Herclass()
    two=Herclass()
    print(one==two)
    print(one is two)
    print(id(one),id(two))
    __new__

    使用装饰器                                                                                              

    from functools import wraps
    
    def sin(cls):
        instances={}
    
        @wraps(cls)
        def get(*args,**kwargs):
            if cls not in instances:
                instances[cls] =cls(*args,**kwargs)
            return instances[cls]
    
    @sin
    class Myclass(object):
        a =1
    
    #我们定义了一个装饰器sin,他返回了一个内部函数get,该函数会判断某一个类是否在字典instance中,如果不存在,就会将cls
    #作为key,cls(*args, **kw) 作为 value 存到 instances 中,否则,直接返回 instances[cls]。
    装饰器

    使用__metaclass__                                                                               

    元类可以控制类的创建过程,三件事:

      ---拦截类的创建

      ---修改类的定义

      ---返回修改后的类

    import threading
    
    
    class Singleton2(type):
        def __init__(cls, name, bases, dict):
            super(Singleton2, cls).__init__(name, bases, dict)
            cls._instance = None
    
        def __call__(cls, *args, **kw):
            if cls._instance is None:
                cls._instance = super(Singleton2, cls).__call__(*args, **kw)
            return cls._instance
    
    #python2
    class MyClass(object):
        __metaclass__ = Singleton2
    
    
    one = MyClass()
    two = MyClass()
    two.a = 3
    
    #print one.a
    # 3
    #print id(one)
    # 31495472
    #print id(two)
    # 31495472
    __metaclass__
  • 相关阅读:
    排序算法对比,步骤,改进,java代码实现
    OracleJDK与OpenJDK的区别和联系
    C++函数中那些不可以被声明为虚函数的函数
    编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作。
    大华2014校园招聘面试题链式存储串的连接操作
    线性表可用顺序表或链表存储的优缺点
    豆瓣面试题strstr)
    百度2014校园招聘消除嵌套的括号
    Wireshark基本介绍和学习TCP三次握手(转载)
    据说是淘宝面试题“给定一个数组将大于0的放在最右边,等于0的放在中间,大于0的放在最左边”
  • 原文地址:https://www.cnblogs.com/tianshuai1/p/11019703.html
Copyright © 2020-2023  润新知