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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、單例設計模式

單例設計模式就是為對象在內存中分配空間的時候,永遠只會返回一個唯一的固定的內存空間。這樣就能保證在內存中這個類的對象只有唯一的一份,這個就叫做單例。(為對象分配空間使用的是內置方法__new__方法)

創建對象時,new方法會被自動調用。如果自己重寫__new__方法,一定要進行返回分配的內存空間,如果不返回,pyhton的解釋器就得不到分配空間的對象引用,如果得不到對象的引用,python的解釋器就不會調用初始化方法,把對象的引用傳遞到初始化的方法內部。

class MusicPlayer(object):#重寫new方法def __new__(cls,*args,**kwargs):#1.創建對象時,new方法會被自動調用print("創建對象,分配空間")#1使用print函數覆蓋了父類object方法的實現#2、為對象分配空間"""怎么樣為對象分配空間?可以直接調用父類的方法就好了,因為object基類中已經默認的new方法已經可以實現為對象分配空間的動作了,所以我們可以直接調用一下父類的方法,要調用父類的方法,應該找一個特殊的對象是super即super().__new__(cls),需要注意的是new方法是一個靜態的方法,所以我們在調用new方法的時候,必須要把第一個參數cls傳遞給這個方法。"""instance=super().__new__(cls)#3、返回對象的引用"""調用完父類的這個方法之后,怎么樣把方法的返回結果返回呢?1、可以直接在上邊加一個return2、還可以定義一個變量接收父類的返回結果(例如shiyong instance接收返回結果)"""return instance#2把對象的引用返回def __init__(self):#3返回之后,這樣python的解釋器就能夠自動調用初始化方法print("播放器初始化")
player=MusicPlayer()
print(player)#打印播放器的內存地址(4初始化方法完成之后,在主程序中把創建好的播放器對象打印在控制臺)

結果:

PS:__new__方法中一定要返回父類方法調用__new__方法的結果就可以,而且new方法是一個靜態的方法,所以在調用父類方法的時候,必須要主動傳遞cls這個參數。

單例設計模式的思想:定義一個類屬性,類屬性的初始值為None,當第一次調用創建對象方法時,我們就在類屬性中記錄住第一個對象的引用,當再次調用創建對象方法時,再次調用創建方法的屬性時,是再次創建,表明第一個對象在內存中已經存在了,那么我們就直接把第一個對象的引用做一個返回,而不再調用父類的分配空間的這一個方法;不再調用父類的分配空間的這一個方法,所以就不會在類的內存中為這個類的其他對象分配額外的內存空間,而只是把之前記錄的第一個對象的引用做一個返回。再次調用時只是把第一個對象的引用做一個返回,這樣呢就能夠做到無論調用多少次創建對象的方法,我們得到的永遠是第一個創建出來的對象的引用。--------------這個就是使用單例設計模式解決在內存中只創建唯一一個實例的解決辦法。

使用單例設計模式來開發設計的類:

這就是怎么樣使用單例設計模式,在創建對象時,無論調用多少次創建對象的方法,得到的結果永遠是第一個創建對象的實例。

class MusicPlayer(object):#1、記錄第一個被創建對象的引用instance=None#使用None作為初始值,因為類定義完成,第一個對象還沒有被創建,必須要主動調用一下創建對象的方法,第一個對象才能夠被創建,因此這個類屬性的初始值我們把它定義為None#2、改造new方法,因為new方法是負責分配內存空間的def __new__(cls,*args,**kwargs):#1判斷類屬性是不是空對象,如果是空對象說明第一個對象還沒有被創建if cls.instance is None:#2如果對象沒有被創建,應該調用父類的方法為第一個對象分配空間(只有為第一個對象分配空間之后我們才能夠使用類屬性進行記錄)cls.instance=super().__new__(cls)#3如果類屬性中已經有了值,就直接把類屬性中保存的第一個對象引用直接返回給python的解釋器就可以了return cls.instance#2把對象的引用返回#這樣無論在外界無論調用多少次創建對象的方法,得到的對象內存地址永遠都是相同的def __init__(self):#3返回之后,這樣python的解釋器就能夠自動調用初始化方法print("播放器初始化")
player1=MusicPlayer()
print(player1)player2=MusicPlayer()
print(player2)#地址一樣就表明player1和player2本質上是相同的對象

結果:

現在實現了內存中只有唯一的一個對象。但是初始化方法被調用了多次,即使用了幾次創建對象的方法初始化方法就被調用了幾次。

改進:讓初始化的動作只被調用一次。所謂初始化的動作就是我們寫在初始化方法內部,對對象進行初始化的代碼。

PS:初始化方法的調用我們不能限制,但是我們可以有特殊的方式來解決一下讓初始化的動作只被執行一次。

class MusicPlayer(object):#1、記錄第一個被創建對象的引用instance=None#記錄是否執行過初始化動作init_flag=False#表明最開始還未執行過初始化的動作def __new__(cls,*args,**kwargs):if MusicPlayer.instance is None:MusicPlayer.instance=super().__new__(cls)return MusicPlayer.instance#2把對象的引用返回def __init__(self):#判斷是否執行過初始化動作if MusicPlayer.init_flag:return#如果類屬性為真,表明已經執行過初始化操作,就直接返回#如果沒有執行過初始化動作,在此執行初始化動作print("播放器初始化")#修改初始化動作的標記MusicPlayer.init_flag=True
player1=MusicPlayer()
print(player1)player2=MusicPlayer()
print(player2)#地址一樣就表明player1和player2本質上是相同的對象

結果見上圖。

2、異常

程序在運行過程中遇到錯誤就會拋出異常。針對于異常我們要捕獲異常。

??

3、模塊

在python中每一個獨立的源文件(以py結尾)就是模塊。

導入模塊之后通過模塊名.使用模塊中提供的工具--------全局變量、函數、類。

寫完一個.py模塊后,我們需要使用一些測試代碼,判斷這個模塊是否可以正常運行,但是這些測試代碼在.py作為模塊導入之后,是不需要被執行的。所以我們通過__name__這個屬性來判斷。

如果我們直接執行當前正在開發的模塊(就是直接執行py這個文件),即直接執行.py(要作為module導入的這個文件)__name__保存的是一個非常固定的字符串,永遠都是__main__。即print(__name__)得到的輸出結果是__main__。

如果將.py作為模塊導入之后,在導入之后的當前的文件下進行打印輸出就是模塊名。

所以怎么判斷.py作為module內的所有未縮進的代碼,在作為模塊被導入的時候測試代碼是否需要被執行呢?我們就可以通過判斷__name__這個屬性是否是__main__或者是模塊名來判斷進行判斷。

4、package

包是一個目錄(directory)/(python package)。在包的目錄下必須要有一個特殊的文件__init__.py

比如有一個發布模塊的目錄,下面包含制作好的包,還需要在發布模塊這個目錄下建立一個setup.py文件,setup.py這個文件和你所制作完成的包同屬于發布模塊這個目錄下。setup.py這個文件的執行必須要進入終端(所有學習都是在ubuntu下安裝的pycharm),使用python的解釋器來執行這個文件,不能在pycharm中執行。

5、文件

計算機的CPU如果想要訪問保存在磁盤上的文件:第一步應該將磁盤中的文件數據加載到內存中,因為內存的讀寫速度要比磁盤的讀寫速度快很多。

計算機能夠識別什么樣的文件數據?計算機中只能識別0101這種二進制方式的數據,所以我們保存在磁盤上的文件本質上都是以二進制的方式來保存的。

但是在我們日常使用中通常會把文件分為兩種類型:第一種叫做文本文件;第二種叫做二進制文件。

所謂文本文件就是可以使用文本編輯軟件直接查看文件內容的文件,我們就把他叫做文本文件。比如我們使用python開發的所有源程序是都可以直接查看內容的,我們就把這種文件叫做文本文件。但是文本文件本質上還是一個二進制文件;

那么我們平時所說的二進制文件是指:我們會把圖片文件,音頻文件,視頻文件等這些文件統稱為二進制文件。之所以叫做二進制文件是因為我們不能夠直接使用文本編輯軟件來查看這些文件的內容,因為這些文件是需要使用其他專門的軟件來打開的。

讀就是將文件在磁盤中的數據加載到內存;而寫就是把內存中的內容再重新寫回到磁盤文件。

??

文本文件中的每一個字符到底是怎樣用二進制來表示的呢?

?

?

?

總結

以上是生活随笔為你收集整理的python基础知识整理 第七节:单例设计模式、异常、模块、包、制作模块、文件的全部內容,希望文章能夠幫你解決所遇到的問題。

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