ITPub博客

首页 > 应用开发 > Python > 【Python培训基础知识】单例模式

【Python培训基础知识】单例模式

原创 Python 作者:千锋教育qyf 时间:2021-04-01 16:58:04 0 删除 编辑

  单例模式是保证一个类仅有一个实例的设计模式。Windows中的任务管理器就是一个典型的单例模式软件。Windows任务管理器如图所示。

  

1

  Windows任务管理器只能打开一个,即使用户重复打开,也只能获得一个实例,这不同于Word等软件可以打开多个实例。这是因为如果有2个窗口同时都能结束进程,那么在窗口A中结束了某进程,而在窗口B中该进程还保留着;反之,在窗口B中结束了某进程,而在窗口A中该进程还保留着。这样就会造成冲突,导致系统崩溃。

  定义单例类的语法格式如下:

  class 类名(object):

  def __new__(cls, *args, **kwargs):

  if not hasattr(cls, '_instance'):

  # 第一种方式

  cls._instance = object.__new__(cls)

  # 第二种方式

  # cls._instance = super(类名, cls).__new__(cls)

  return cls._instance

  创建的单例类继承了object类。类中定义了一个魔法方法__new__(),__new__()方法是创建实例时调用的方法,因此,常说的创建一个实例,其实就是使用这个方法创建的。在__new__()方法中,第一个参数为cls,说明这是一个类方法,后面两个参数分别为*args和**kwargs。用这个方法来创建唯一实例。__new__()方法中,采用if语句判断当前类的实例是否存在,如果不存在,那么需要先创建实例,再返回当前类的实例;如果存在,那么直接返回当前类的实例。可以采用两种方式来创建实例,第一种方式是父类object调用魔法方法__new__(),参数为当前类本身;第二种是用super()方法,指定调用当前类父类的__new__()方法。

  下面是一个单例类的示例。先编写一个Singleton类,代码如下:

  

2

  再创建Singleton类的两个实例,代码如下:

  

3

  最后通过id()函数生成两个实例的内存地址,从而判断Singleton类是不是单例类,代码如下:

  

4

  运行结果:

  

5

  由运行结果可知,这两个实例的内存地址一致,说明是同一个实例,即生成的是单一实例,也就是说s1和s2其实是这一个实例的不同名称而已,因此,Singleton类是单例类。

  在上述示例的基础上,先创建一个Mother类继承Singleton类,类中包含实例属性msg表示菜信息,实例方法get_food()用于接收并拼接菜信息msg,实例方法food()用于打印菜信息msg:

  

6

  再创建Mother类的两个实例,并分别调用get_food()方法将菜信息作为参数进行传递,代码如下:

  

7

  最后分别打印这两个实例的内存地址,并调用food()方法打印菜信息,代码如下:

  

8

  运行结果:

  

9

  由于Monther类继承了Singleton类,因此,实例mother1和mother2指向的是同一个内存地址,两次调用get_food()方法,参数中的字符串会拼接在一起,在调用food()方法时,打印结果都是拼接后的“西红柿鸡蛋”。

  如果在创建Mother类时不继承Singleton类,那么运行结果是否发生改变呢?只修改定义Mother类的第一行代码,其余代码不变,修改的代码如下:

  

11

  运行结果:

  

10

  由两次的运行结果可知,修改之前打印的两个内存地址是相同的,而修改之后打印的两个内存地址不相同,说明修改之后创建Monther类的两个实例是不同的实例,因此,这两个实例分别调用get_food()方法时,字符串不会进行拼接,调用food()方法时打印结果也不相同。

  综上所述,单例模式只有唯一实例,解决资源共享问题,节约系统内存,提高系统运行效率。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69996644/viewspace-2766197/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
千锋教育隶属于北京千锋互联科技有限公司,以“初心至善,匠心育人”为核心价值观,致力于打造职业教育全产业链人才服务平台,公司总部位于北京,拥有全国一体化就业保障服务,成为学员信赖的职业教育品牌。 每年有数百万名学员受益于千锋组织的技术研讨会、技术培训课、网络公开课及免费教学视频。

注册时间:2021-03-17

  • 博文量
    527
  • 访问量
    204710