标签:ret cell turn 模式 return 直接 toolbar python实现 object
Python 下的单例模式
要点:
方法:重写new函数
应该考虑的情况:
要点:
实例化的过程其实不是直接调用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 | classpeople(object):    def__new__(cls,*args,**kargs):        returnsuper(people,cls).__new__(cls)    def__init__(self,name):        self.name =name            deftalk(self):        print("hello,I am %s"%self.name)            classstudent(people):    def__new__(cls,*args,**kargs):        ifnothasattr(cls,"instance"):                        cls.instance =super(student,cls).__new__(cls,*args,**kargs)        returncls.instancea =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 | classpeople(object):    def__new__(cls,*args,**kargs):        returnsuper(people,cls).__new__(cls)    def__init__(self,name):        self.name =name            deftalk(self):        print("hello,I am %s"%self.name)            classstudent(people):    def__new__(cls,*args,**kargs):        ifnothasattr(cls,"instance"):            cls.instance =super(student,cls).__new__(cls,*args,**kargs)        returncls.instance    def__init__(self,name):        ifnothasattr(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实现了一个简易的单例模式.
标签:ret cell turn 模式 return 直接 toolbar python实现 object
原文地址:https://www.cnblogs.com/niucunguo/p/11507364.html