python物件導向之單例模式

2021-08-26 05:29:24 字數 2516 閱讀 2589

一.什麼叫單例模式

基於某種方法通過類例項化的得到的物件,或者說記憶體位址指向同乙個.

總共有4種方式.最後乙個方式就是當作包匯入使用。

方式一

方式一

settings.py檔案中內容:

ip = '1.1.1.1'

port = 3306

版本一import settings

class mysql:

__instance = none

def __init__(self, ip, port):

self.ip = ip

self.port = port

@classmethod

def from_conf(cls):

if not cls.__instance: #cls = mysql ==>如果mysql.__instance為假,執行下面**

cls.__instance = cls(settings.ip, settings.port)# ===>呼叫mysql(settings.ip, settings.port)進行例項化

return cls.__instance

obj1 = mysql.from_conf()

obj2 = mysql.from_conf()

obj3 = mysql('1.1.1.10', 3302)

print(obj1)

print(obj2)

print(obj3)

版本二class mysql:

def __init__(self, ip, port):

self.ip = ip

self.port = port

@classmethod

def from_conf(cls):

if not hasattr(cls,'_%s__instance'%cls.__name__):#通過反射方法hasattr來判斷

cls.__instance = cls(settings.ip, settings.port)# ===>呼叫mysql(settings.ip, settings.port)進行例項化

return cls.__instance

obj1 = mysql.from_conf()

obj2 = mysql.from_conf()

obj3 = mysql('1.1.1.10', 3302)

print(obj1)

print(obj2)

print(obj3)

方式二

def singleton(cls):

_instance = cls(settings.ip, settings.port) # 先導入配置檔案settings中的內容

if args or kwargs: # 如果有引數

obj = cls(*args, **kwargs) # 例項化物件obj

return obj

class mysql:

def __init__(self, ip, port):

self.ip = ip

self.port = port

obj2 = mysql()

print(obj1)

print(obj2)

print(obj3)

方式三

class mymeta(type):

def __init__(self,class_name,class_bases,class_dic):#self = mysql

super().__init__(class_name,class_bases,class_dic)

self.__instance = self(settings.ip,settings.port)

def __call__(self, *args, **kwargs):

if args or kwargs:

obj = self.__new__(self) #建立乙個空物件

self.__init__(obj,*args, **kwargs) #初始化空物件

return obj #返回初始化好的物件

return self.__instance#返回乙個建立好的msql物件

class mysql(metaclass=mymeta): #mysql = mymeta(...)

def __init__(self, ip, port):

self.ip = ip

self.port = port

obj1 = mysql()

obj2 = mysql()

obj3 = mysql('1.1.1.2', 3307)

print(obj1)

print(obj2)

print(obj3)

python之路 物件導向之單例模式

什麼是單例模式 基於某種實現方式,例項化產生的多個物件是同乙個 指向同乙個記憶體位址 以節省記憶體 實現方式一 通過類繫結方法 import setting class mysql def init self,ip,port self.ip ip self.port port classmethod...

Python中物件導向之單例設計模式

物件導向的單例設計模式 普通模式class person def init self,name,age self.name name self.age age obj1 person 小明 20 obj2 person 小紅 25 obj3 person 小藍 30 print id obj1 id...

物件導向(Python) 學習筆記之單例模式

單例設計模式的應用場景 站 物件 印表機 物件 重寫 new 方法的 非常固定 class musicplayer def new cls,args,kwargs 1.建立物件時,new方法會被自動呼叫 print 建立物件,分配空間 2.為物件分配空間 instance super new cls...