91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python下如何實現單例模式

發布時間:2021-08-26 10:52:19 來源:億速云 閱讀:141 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Python下如何實現單例模式的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Python 下的單例模式

要點:

  1. 1.某個類只能有一個實例;

  2. 2.它必須自行創建這個實例;

  3. 3.它必須自行向整個系統提供這個實例

方法:重寫new函數

應該考慮的情況:

  1. 1.這個單例的類可能繼承了別的類

  2. 2.這個單例的類還有可能要接收參數來實例化

要點:

實例化的過程其實不是直接調用init的,首先是new分配一塊空間來創建實例,再由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先創建明明是Timo,可是為什么a的name變成了Luyi呢?

原因:
雖然確實是a這個實例,但是在最后c重新調用了new,返回了a的實例,再經過init,改變了a的屬性,執行時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下如何實現單例模式”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开阳县| 闽清县| 多伦县| 新竹市| 司法| 孟村| 云龙县| 北流市| 高密市| 留坝县| 大埔县| 宁德市| 工布江达县| 盘山县| 凯里市| 通榆县| 离岛区| 株洲县| 三河市| 宁远县| 都兰县| 高邑县| 于都县| 含山县| 平昌县| 莎车县| 丰原市| 晋中市| 宿迁市| 新绛县| 西乌珠穆沁旗| 思茅市| 商南县| 锦屏县| 天水市| 新平| 岚皋县| 年辖:市辖区| 彩票| 江华| 德化县|