日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python单例模式解析_Python下简易的单例模式详解

發(fā)布時間:2023/12/19 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python单例模式解析_Python下简易的单例模式详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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下简易的单例模式详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。