• python单例模式(转)


    单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。

     

    实现某个类只有一个实例的途径:

    1,让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象。

    2,让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。

    多线程时的单例模式:加锁-双重锁定

    饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点是提前占用系统资源。

    懒汉式单例类:在第一次被引用时,才将自己实例化。避免开始时占用系统资源,但是有多线程访问安全性问题。

    实例:

     

    #encoding=utf-8
    #单例模式
    def PrintInfo(info):
    #    print unicode(info,'utf-8').decode('gbk')
        print info.decode('utf-8').encode('utf-8')  
    import threading
    #单例类
    class Singleton():
        instance=None
        mutex=threading.Lock()
        def _init__(self):
            pass
        @staticmethod
        def GetInstance():
            if(Singleton.instance==None):
                Singleton.mutex.acquire()
                if(Singleton.instance==None):
                    PrintInfo('初始化实例')
                    Singleton.instance=Singleton()
                else:
                    PrintInfo('单例已经实例化')
                Singleton.mutex.release()
            else:
                PrintInfo('单例已经实例化')
               
            return Singleton.instance
    def clientUI():
        Singleton.GetInstance()
        Singleton.GetInstance()
        Singleton.GetInstance()
       
        return
    if __name__=='__main__':
        clientUI();

     

    结果:

    初始化实例 单例已经实例化 单例已经实例化        

    追加解释 @staticmethod 在 Python中提到 classmethod 就要提到 staticmethod,不是因为二者有什么关系,而是为了让用户区分以便更清楚地写代码。在C++中,我们了解直接通过类名访问的函数称为类的静态函数,即static修饰的函数,可见C++中classmethod和staticmethod是一个概念。 那么python中二者有什么区别呢?先来看下二者如何在python代码中声明 

    class MyClass:
     ...
     
      @classmethod  # classmethod的修饰符
      def class_method(cls, arg1, arg2, ...):
       ...
      @staticmethod  # staticmethod的修饰符
      def static_method(arg1, arg2, ...):
       ...

    对于classmethod的参数,需要隐式地传递类名,而staticmethod参数中则不需要传递类名,其实这就是二者最大的区别。
    二者都可以通过类名或者类实例对象来调用,因为强调的是classmethod和staticmethod,所以在写代码的时候最好使用类名,良好的编程习惯吧。
    对于staticmethod就是为了要在类中定义而设置的,一般来说很少这样使用,可以使用模块级(module-level)的函数来替代它。既然要把它定义在类中,想必有作者的考虑。
    对于classmethod,可以通过子类来进行重定义。
    提到类级别的函数,也顺带提及类级别的变量

    class MyClass:
     
     i = 123 # class-level variable
     
     def __init__(self):
      self.i = 456 # object-level variable
      ...

    为了清晰地区分上面两个i,最好的办法就是考虑到python中的一切都是object,所以i=123属于class object的,i=456属于class instance object

     

  • 相关阅读:
    支付宝H5支付---证书模式
    Redis分布式锁
    Docker+Nginx+Ssl
    Java调用函数传递参数到底是值传递还是引用传递
    Mysql索引查询失效的情况
    mysql索引之最左前缀法则
    数据的三大范式以及什么是反三大范式
    SpringMvc的工作流程
    Android 环境搭建
    Python 爬虫: 抓取花瓣网图片
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3097425.html
Copyright © 2020-2023  润新知