zoukankan      html  css  js  c++  java
  • python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释

    • 模块模式
    • 装饰器模式
    • 父类重写new继承

    单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singleton实现的四种方法都是python的重要特征,反过来也刚好是几种特征的最佳实现.(比如你平常开发中很难遇到几个需要写元类的地方)如果不能随手写出某种实现,说明你对于那种实现的概念还没有完全掌握.最近场通过写装饰器模式的singleton来复习装饰器概念.

    1. module实现

    #模块实现
    from Singleton import instance
    
    instance

    <Singleton.Singleton at 0x19cf6691240>
    #Singleton.py
    class Singleton(object):
    pass
    
    instance = Singleton()
    

    知识点关联 

    python导入模块时即将模块运行一遍,可定义__all__变量指定那些变量可以被外部引用

    2. 装饰器实现

    #decorator装饰器实现
    def Singleton(cls):
        #instance作为字典变量写在外部,可以保证该装饰器的重用性
        _instances = {}
        def getinstance(*arg,**kwarg):
            if cls not in _instances:
                _instances[cls] = cls(*arg,**kwarg)
            return _instances[cls]
        return getinstance
    
    @Singleton
    class A(object):
        pass
    a = A()
    b = A()

    print(id(a)) #2268820031976
    print(id(b))  #2268820031976

    1 a is b
    2 
    3 True
    4 
    5 A.__name__
    6 
    7 'getinstance'

    从学习过程来看,装饰器学习的要点在于理解at语法等于一次A = Singleton(A).装饰过后A.__name__查看可以发现已经变成getinstance,在装饰器的getinstance之前使用functool.wrap可以解决问题.  

    3. 父类继承实现

    #父类重写__new__
    class Singleton(object):
        _instance = None
        def __new__(cls,*arg,**kwarg):
            if not cls._instance:
                cls._instance = super(Singleton,cls).__new__(cls, *arg, **kwarg)
            return cls._instance
    class A(Singleton):
       pass

    通过这个例子可以了解到父类都可以做些什么,无非是提前定义变量和函数.通过重写__new__函数,改变了A类别创建实例的过程.
    推广开来的话,基本上本文的四个例子都是在”改变创建实例的过程”.包括JAVA中实现单例的几种方法也是同个道理.记住了这一点,知识便有了线索,就算下次忘了细节,也能沿着线索重新回忆所学过的内容.
    将程序设计的思想应用到学习过程中,从例子中抽象得出原理,可以提高学习效率.

  • 相关阅读:
    Java原始数据类型
    Java文件教程
    Java.util.ArrayDeque类
    Java 简介
    面向对象的程序设计
    Java8默认方法
    divide方法
    java.lang.Boolean.compareTo()方法实例
    AWT Button类
    Java的核心优势
  • 原文地址:https://www.cnblogs.com/daijingkun/p/10752669.html
Copyright © 2011-2022 走看看