python单例模式解析_Python下简易的单例模式详解
Python 下的單例模式
要點:
1.某個類只能有一個實例;
2.它必須自行創(chuàng)建這個實例;
3.它必須自行向整個系統(tǒng)提供這個實例
方法:重寫new函數(shù)
應該考慮的情況:
1.這個單例的類可能繼承了別的類
2.這個單例的類還有可能要接收參數(shù)來實例化
要點:
實例化的過程其實不是直接調用init的,首先是new分配一塊空間來創(chuàng)建實例,再由init對這個實例進行初始化.我們無法阻止new和init的調用,我們只能是限制他們的內容,以此使他們能達到單例的目的
代碼:
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先創(chuàng)建明明是Timo,可是為什么a的name變成了Luyi呢?
原因:
雖然確實是a這個實例,但是在最后c重新調用了new,返回了a的實例,再經過init,改變了a的屬性,執(zhí)行時name ->Luyi.
解決:
這種情況下,我們只需要設置類變量,讓init在類變量的限制下,只對類進行一次有效的初始化.
代碼:
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實現(xiàn)了一個簡易的單例模式.
以上所述是小編給大家介紹的Python下簡易的單例模式詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
總結
以上是生活随笔為你收集整理的python单例模式解析_Python下简易的单例模式详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vertx web连接超时 阻塞_Fli
- 下一篇: python二维高斯分布生成_pytho