單例模式:一種套路.單個例項物件.建立一次就是乙個例項物件.通過這種模式建立出來的例項是同乙個.同乙個記憶體位址.類似列表的建立不同物件,操作其中乙個,另外乙個也會跟著變化
不同的功能模組裡面,使用的是同乙個物件.很多.py檔案裡面,多個地方使用同乙個例項物件.最常見的就是建立資料庫的連線,每個.py檔案都是連同乙個資料庫,建立的連線一般也是同乙個.
資料共享:單例,只有乙個真正的例項,位址只有乙個
購物車模型,不同店鋪裡 新增食品,新增鞋子,但是還是同乙個賬戶的購物車.
模式:根據實際開發設計的過程總結出來的.
單例: 建立出來的位址是同乙個
核心:object的new方法和init只執行一次.
單例的核心思想:就是讓object的new方法只能呼叫一次,後面都是把第一次建立好的例項物件返回.讓init方法中定義的例項屬性的**只執行一次.
目的:實現資料共享
object的new方法只呼叫一次,init方法中定義屬性的**也只呼叫一次.
應用示例:
1.python的logger就是乙個單例模式,用以日誌記錄
2.windows的資源管理器是乙個單例模式
3.執行緒池,資料庫連線池等資源池一般也用單例模式
4.**計數器
classuserinfo:
__instance = none #
類屬性 此屬性來儲存建立好的例項物件.設定成私有屬性 __不讓外部修改
__has_init = false #
類屬性 預設還未初始化
def__new__(cls, *args, **kwargs):
#print(cls) # 隱藏了這個過程# userinfo.__new__(userinfo) # 當前類
#obj = object.__new__(userinfo) # 建立的是userinfo物件,所以設定成了靜態方法,讓我們自己去手動控制傳遞的類物件.預設是呼叫的自己的.父類被重寫了
if cls.__instance
isnone:
cls.
__instance = object.__new__(cls) #
保證只會建立一次.一定要是cls的屬性來接收object建立的類物件.
#建立的是userinfo物件,所以設定成了靜態方法,讓我們自己去手動控制傳遞的類物件.預設是呼叫的自己的.父類被重寫了
return cls.__instance
#這樣就只會建立一次.這裡不能縮排到if裡面,否則第2個就是none
def__init__(self): #
2次if userinfo.__has_init
is false: #
一直都是類屬性__has_init
self.name = '超哥'
(self)
#print(userinfo)
userinfo.__has_init = true #
true: 設定成 已經初始化 類屬性
#if self.__has_init is false: # 使用self就會生成乙個和類屬性同名的例項屬性. 所以這裡不要這麼寫.這樣的self就是例項物件在訪問類屬性__has_init了.(因為例項物件是可以訪問類屬性的.)
#print(self)
#self.name = '超哥'
#self.__has_init = true # 已經初始化 這樣self代表的例項物件就不是類物件.這樣賦值操作就是直接給例項物件建立了乙個和類屬性同名的例項屬性值.第一次可以訪問,第二次之後就不一定了.
#userinfo.__new__(userinfo) # 就是遞迴了,死迴圈
單例模式的寫法:
#redis客戶端的單例
class
redisclient(object):
def__init__
(self, host, port):
self.redis = redis.strictredis(host=host, port=port)
#保證單例,減少連線數
def__new__(cls, *args, **kwargs):
ifnot hasattr(cls, '
__instance'):
cls.
__instance = object.__new__
(cls)
cls.func_dict ={}
return cls.__instance
單例類裝飾器:
defsingleton(cls):
"""單例類裝飾器
"""_instance ={}
def _singleton(*args, **kargs):
if cls not
in_instance:
_instance[cls] = cls(*args, **kargs)
return
_instance[cls]
return _singleton
常用設計模式 單例模式
1.單例模式的特點 1.單例類在系統中僅有乙個例項 2.單例類必須自己建立自己的例項 3.單例類必須向系統中的其他物件提供這個例項 2.單例模式的兩種模式 public class test 2.1 餓漢模式 public class singleton 建立類的唯一例項 private stati...
常用設計模式 單例模式
一 單例模式定義 單例模式確保某個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池 快取 日誌物件 對話方塊 印表機 顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每台計算機可以有若干個印表機,但只能有乙個printer spooler,...
常用設計模式 單例模式
應用執行過程當中,只有乙個物件的模式,叫做單例模式 1.構造器私有 2.提供可以獲得物件的靜態方法 3.將物件設定為靜態 懶漢模式 用的時候再建立 餓漢模式 載入的時候就建立 public class singleton 構造器私有,無法在外部例項化這個物件 外部一千一萬個物件也都只能是對perso...