当前位置:脚本大全 > > 正文

python单例模式读取配置文件(Python下简易的单例模式详解)

时间:2021-10-22 07:09:23类别:脚本大全

python单例模式读取配置文件

Python下简易的单例模式详解

python 下的单例模式

要点:

  1. 1.某个类只能有一个实例;
  2. 2.它必须自行创建这个实例;
  3. 3.它必须自行向整个系统提供这个实例

方法:重写new函数

应该考虑的情况:

  1. 1.这个单例的类可能继承了别的类
  2. 2.这个单例的类还有可能要接收参数来实例化

要点:

实例化的过程其实不是直接调用init的,首先是new分配一块空间来创建实例,再由init对这个实例进行初始化.我们无法阻止new和init的调用,我们只能是限制他们的内容,以此使他们能达到单例的目的

代码:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • class people(object):
  •     def __new__(cls,*args,**kargs):
  •         return super(people,cls).__new__(cls)
  •     def __init__(self,name):
  •         self.name = name
  •         
  •     def talk(self):
  •         print("hello,i am %s" %self.name)
  •     
  •     
  •     
  • class student(people):
  •     def __new__(cls,*args,**kargs):
  •         if not hasattr(cls,"instance"):
  •             
  •             cls.instance = super(student,cls).__new__(cls,*args,**kargs)
  •         return cls.instance
  •  
  • a = student("timo")
  • print(a)
  • b = student("kysa")
  • c = student("luyi")
  • a.talk()
  • b.talk()
  • print(c)
  • 这里的输出结果是:

    <__main__.student object at 0x0000025ac48bf2e8>
    hello,i am luyi
    hello,i am luyi
    <__main__.student object at 0x0000025ac48bf2e8>

    可以确定的是: 确实是单例了,因为a的id和b,c的id是一致的

    但是为什么:a先创建明明是timo,可是为什么a的name变成了luyi呢?

    原因:
    虽然确实是a这个实例,但是在最后c重新调用了new,返回了a的实例,再经过init,改变了a的属性,执行时name ->luyi.

    解决:
    这种情况下,我们只需要设置类变量,让init在类变量的限制下,只对类进行一次有效的初始化.

    代码:

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • class people(object):
  •     def __new__(cls,*args,**kargs):
  •         return super(people,cls).__new__(cls)
  •     def __init__(self,name):
  •         self.name = name
  •         
  •     def talk(self):
  •         print("hello,i am %s" %self.name)
  •     
  •     
  •     
  • class student(people):
  •     def __new__(cls,*args,**kargs):
  •         if not hasattr(cls,"instance"):
  •             cls.instance = super(student,cls).__new__(cls,*args,**kargs)
  •         return cls.instance
  •     def __init__(self,name):
  •         if not hasattr(self,"init_fir"):
  •             self.init_fir = true
  •             super(student,self).__init__(name)
  • a = student("timo")
  • print(a)
  • b = student("kysa")
  • c = student("luyi")
  • a.talk()
  • b.talk()
  • print(c)
  • 好了,到这里就用python实现了一个简易的单例模式.

    以上所述是小编给大家介绍的python下简易的单例模式详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!

    原文链接:https://blog.csdn.net/whyfive4/article/details/89048773

    上一篇下一篇

    猜您喜欢

    热门推荐