实战IT培训机构_黄色激情网站_IT培训班选大学生IT技术培训中心_黄色激情视频网站_中公优就业

400-650-7353
您所在的位置:首頁 > IT干貨資料 > python > 【Python基礎知識】單例模式

【Python基礎知識】單例模式

  • 發布: python培訓
  • 來源:python培訓問答
  • 2021-03-22 16:22:06
  • 閱讀()
  • 分享
  • 手機端入口

單例模式是保證一個類僅有一個實例的設計模式。Windows中的任務管理器就是一個典型的單例模式軟件。Windows任務管理器如圖所示。

Windows任務管理器

Windows任務管理器只能打開一個,即使用戶重復打開,也只能獲得一個實例,這不同于Word等軟件可以打開多個實例。這是因為如果有2個窗口同時都能結束進程,那么在窗口A中結束了某進程,而在窗口B中該進程還保留著;反之,在窗口B中結束了某進程,而在窗口A中該進程還保留著。這樣就會造成沖突,導致系統崩潰。

定義單例類的語法格式如下:

class 類名(object):

def __new__(cls, *args, **kwargs):

if not hasattr(cls, '_instance'):

# 第一種方式

cls._instance = object.__new__(cls)

# 第二種方式

# cls._instance = super(類名, cls).__new__(cls)

return cls._instance

創建的單例類繼承了object類。類中定義了一個魔法方法__new__(),__new__()方法是創建實例時調用的方法,因此,常說的創建一個實例,其實就是使用這個方法創建的。在__new__()方法中,第一個參數為cls,說明這是一個類方法,后面兩個參數分別為*args和**kwargs。用這個方法來創建唯一實例。__new__()方法中,采用if語句判斷當前類的實例是否存在,如果不存在,那么需要先創建實例,再返回當前類的實例;如果存在,那么直接返回當前類的實例。可以采用兩種方式來創建實例,第一種方式是父類object調用魔法方法__new__(),參數為當前類本身;第二種是用super()方法,指定調用當前類父類的__new__()方法。

【Python基礎知識】單例模式

下面是一個單例類的示例。先編寫一個Singleton類,代碼如下:

  1. class Singleton(object): 
  2.     def __new__(cls, *args, **kwargs): 
  3.         if not hasattr(cls'_instance'): 
  4.             cls._instance = object.__new__(cls
  5.             # cls._instance = super(Singleton, cls).__new__(cls) 
  6.         return cls._instance 

再創建Singleton類的兩個實例,代碼如下:

  1. s1 = Singleton() 
  2. s2 = Singleton() 

最后通過id()函數生成兩個實例的內存地址,從而判斷Singleton類是不是單例類,代碼如下:

  1. print('s1的地址:{},s2的地址:{}'.format(id(s1), id(s2))) 

運行結果:

  1. s1的地址:31244920,s2的地址:31244920 

由運行結果可知,這兩個實例的內存地址一致,說明是同一個實例,即生成的是單一實例,也就是說s1和s2其實是這一個實例的不同名稱而已,因此,Singleton類是單例類。

在上述示例的基礎上,先創建一個Mother類繼承Singleton類,類中包含實例屬性msg表示菜信息,實例方法get_food()用于接收并拼接菜信息msg,實例方法food()用于打印菜信息msg:

  1. class Mother(Singleton):   # 繼承Singleton類 
  2.     def __init__(self, msg=''): 
  3.         self.msg = msg 
  4.     def get_food(self, new_food): 
  5.         self.msg += new_food 
  6.     def food(self): 
  7.         print('做菜:'self.msg) 

再創建Mother類的兩個實例,并分別調用get_food()方法將菜信息作為參數進行傳遞,代碼如下:

  1. mother1 = Mother() 
  2. mother2 = Mother() 
  3. mother1.get_food('西紅柿'
  4. mother2.get_food('雞蛋'

最后分別打印這兩個實例的內存地址,并調用food()方法打印菜信息,代碼如下:

  1. print('兒子的媽媽id:', id(mother1)) 
  2. mother1.food() 
  3. print('女兒的媽媽id:', id(mother2)) 
  4. mother2.food() 

運行結果:

  1. 兒子的媽媽id: 5758896 
  2. 做菜: 西紅柿雞蛋 
  3. 女兒的媽媽id: 5758896 
  4. 做菜: 西紅柿雞蛋 

由于Monther類繼承了Singleton類,因此,實例mother1和mother2指向的是同一個內存地址,兩次調用get_food()方法,參數中的字符串會拼接在一起,在調用food()方法時,打印結果都是拼接后的“西紅柿雞蛋”。

如果在創建Mother類時不繼承Singleton類,那么運行結果是否發生改變呢?只修改定義Mother類的第一行代碼,其余代碼不變,修改的代碼如下:

  1. class Mother(): 

運行結果:

  1. 兒子的媽媽id: 169246848 
  2. 做菜: 西紅柿 
  3. 女兒的媽媽id: 169246904 
  4. 做菜: 雞蛋 

由兩次的運行結果可知,修改之前打印的兩個內存地址是相同的,而修改之后打印的兩個內存地址不相同,說明修改之后創建Monther類的兩個實例是不同的實例,因此,這兩個實例分別調用get_food()方法時,字符串不會進行拼接,調用food()方法時打印結果也不相同。

綜上所述,單例模式只有唯一實例,解決資源共享問題,節約系統內存,提高系統運行效率。

文章“【Python基礎知識】單例模式”已幫助

>>本文地址:http://www.jecan.cn/zhuanye/2021/68021.html

THE END  

聲明:本站稿件版權均屬中公教育優就業所有,未經許可不得擅自轉載。

1 您的年齡

2 您的學歷

3 您更想做哪個方向的工作?

獲取測試結果
  • 大前端大前端
  • 大數據大數據
  • 互聯網營銷互聯網營銷
  • JavaJava
  • Linux云計算Linux
  • Python+人工智能Python
  • 嵌入式物聯網嵌入式
  • 全域電商運營全域電商運營
  • 軟件測試軟件測試
  • 室內設計室內設計
  • 平面設計平面設計
  • 電商設計電商設計
  • 網頁設計網頁設計
  • 全鏈路UI/UE設計UI設計
  • VR/AR游戲開發VR/AR
  • 網絡安全網絡安全
  • 新媒體與短視頻運營新媒體
  • 直播帶貨直播帶貨
  • 智能機器人軟件開發智能機器人
 

快速通道fast track

近期開班時間TIME

主站蜘蛛池模板: 实体店商新零售|微赢|波后|波后合作|微赢集团 | 消泡剂_水处理消泡剂_切削液消泡剂_涂料消泡剂_有机硅消泡剂_广州中万新材料生产厂家 | 杭州货架订做_组合货架公司_货位式货架_贯通式_重型仓储_工厂货架_货架销售厂家_杭州永诚货架有限公司 | 南京雕塑制作厂家-不锈钢雕塑制作-玻璃钢雕塑制作-先登雕塑厂 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 商标转让-商标注册-商标查询-软著专利服务平台 - 赣江万网 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 硫酸亚铁-聚合硫酸铁-除氟除磷剂-复合碳源-污水处理药剂厂家—长隆科技 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 气力输送_输送机械_自动化配料系统_负压吸送_制造主力军江苏高达智能装备有限公司! | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 东莞办公家具厂家直销-美鑫【免费3D效果图】全国办公桌/会议桌定制 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 土壤检测仪器_行星式球磨仪_土壤团粒分析仪厂家_山东莱恩德智能科技有限公司 | 衬四氟_衬氟储罐_四氟储罐-无锡市氟瑞特防腐科技有限公司 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 物流之家新闻网-最新物流新闻|物流资讯|物流政策|物流网-匡匡奈斯物流科技 | 刘秘书_你身边专业的工作范文写作小秘书 | 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 亿诺千企网-企业核心产品贸易| 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 粤丰硕水性环氧地坪漆-防静电自流平厂家-环保地坪涂料代理 | 礼堂椅厂家|佛山市艺典家具有限公司| 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 |