Python单例模式实例详解

作者:一个人的天空@ 时间:2021-06-26 03:06:17 

本文实例讲述了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程序设计有所帮助。

标签:Python,单例模式
0
投稿

猜你喜欢

  • 关于Python中request发送post请求传递json参数的问题

    2022-12-23 06:20:33
  • django-利用session机制实现唯一登录的例子

    2022-09-10 23:20:20
  • Python中property属性实例解析

    2022-02-04 20:38:12
  • Python中实现ipaddress网络地址的处理

    2023-12-04 16:43:38
  • Python如何测试stdout输出

    2023-10-22 23:59:56
  • Python3 pandas 操作列表实例详解

    2021-11-30 14:24:12
  • CSS nuggets CSS金矿

    2009-10-28 18:59:00
  • jupyter notebook远程访问不了的问题解决方法

    2022-10-30 08:41:06
  • 深入理解python中的ThreadLocal

    2022-02-08 11:40:03
  • Python办公自动化之教你用Python批量识别发票并录入到Excel表格中

    2021-02-03 12:25:21
  • python批量生成条形码的示例

    2023-02-22 17:49:03
  • Python爬取奶茶店数据分析哪家最好喝以及性价比

    2021-02-19 08:41:45
  • Pytorch 的 LSTM 模型的示例教程

    2021-08-01 22:28:41
  • 详解Python实现图像分割增强的两种方法

    2022-08-16 20:23:50
  • Python OpenCV视频截取并保存实现代码

    2023-01-05 06:04:21
  • python threading和multiprocessing模块基本用法实例分析

    2021-08-13 04:23:49
  • 基于Python编写一个ISBN查询工具

    2022-02-22 09:43:21
  • Python调用实现最小二乘法的方法详解

    2022-07-04 16:31:00
  • Python破解excel进入密码的过程详解

    2021-06-14 03:06:25
  • python for循环remove同一个list过程解析

    2023-03-20 22:07:48
  • asp之家 网络编程 m.aspxhome.com