这篇文章主要介绍了 Python 单例模式, 结合实例形式分析了单例模式的概念、实现与使用方法、已经相关注意事项, 需要的朋友可以参考下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
本文实例讲述了 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
希望本文所述对大家 Python 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0323/326079.html