Python 提高重要知識點彙總
1 什麼是GIL?GIL對多執行緒的影響
GIL全稱Global Interpreter Lock(全域性直譯器鎖)。GIL和Python語言沒有任何關係,只是因為歷史原因導致在官方推薦的直譯器Cpython中遺留的問題。(多執行緒)每個執行緒在執行的過程中都需要先獲取GIL,保證同一時刻只有一個執行緒可以執行程式碼,但是當遇到IO阻塞會自動的釋放GIL鎖,所以使用多執行緒還是比單執行緒的效率要高。如果想發揮多核CPU資源,可以使用多程序。為了避免受GIL的影響可以不用官方推薦的Cpython,或者用其他語言來實現,使用多程序。
計算密集型建議採用程序
IO密集型建議採用執行緒或者協程
2 深拷貝和淺拷貝
copy.copy()
淺拷貝是對一個物件的頂層(外層)拷貝,只是拷貝了引用,並沒有拷貝內容。
變數的賦值是地址的引用,也算是一種淺拷貝。
copy.deepcopy()
深拷貝則是對一個物件深層(遞迴)的拷貝,保證了資料的獨立性。
知識點:
可變型別:列表、字典
不可變型別:數字型別、字串型、元組
- 如果是可變型別,淺拷貝只拷貝外層,而深拷貝是完全拷貝
- 如果是純的不可變型別,那麼無論是淺拷貝還是深拷貝,都只是指向同一個地址
- 如果不可變型別裡面還存在可變型別,則淺拷貝是指向,而深拷貝則為完全拷貝
(瞭解)列表切片、字典的copy方法均屬於淺拷貝
3 私有化
xx: 公有變數
_x: 單前置下劃線,私有化屬性或方法,from 模組 import *禁止匯入,類物件和子類可以訪問。
__xx:雙前置下劃線,避免與子類中的屬性命名衝突,無法在外部直接訪問(名字重整所以訪問不到,_類名__xx)
__xx__:雙前後下劃線,使用者名稱字空間的魔法物件或屬性。例如:__init__ , __ 不要自己發明這樣的名字。
xx_:單後置下劃線,用於避免與Python關鍵詞的衝突,不推薦使用。
4 模組搜尋順序
import sys
sys.path # 返回查詢模組的列表目錄,列表中的路徑的先後順序代表了python直譯器在搜尋模組時的先後順序。第一個元素返回的是一個空字串表示當前目錄。
sys.path.append('/home/itcast/xxx') # 在列表最後追加搜尋目錄
sys.path.insert(0, '/home/itcast/xxx') # 可以確保先搜尋這個路徑
5 重新匯入模組
from imp import reload
reaload(模組名)
(必須得先import 模組)
6 多模組開發時注意事項
通過from 模組 import 變數,此時相當於給一個變數賦值,如果在程式中修改了變數的值就導致這個變數成了區域性變數,跟其他模組就不共享了。如果多模組開發時想匯入變數,建議使用import 模組名的方式,然後通過模組名.變數的方式去呼叫。
7 面向物件的三大特性(封裝、繼承、多型)
封裝就是把方法和屬性封裝到類(類是抽象的,不能直接使用)的內部,只需要在類的外部,通過物件即可呼叫。繼承實現了程式碼的重用。子類可以繼承父類,並且可以繼承多個父類即多繼承,子類可以使用父類所擁有的屬性和方法(除了私有屬性和方法)。多型是以繼承和重寫父類方法為前提,增加了程式碼的靈活度,只是一種呼叫技巧。
8 多繼承以及MRO順序
多繼承指的是子類繼承多個父類,可以通過三種方式訪問父類的方法:
父類名.父類方法(self):這種方式容易造成父類方法被呼叫多次的問題,而且一旦父類名稱發生變化,子類呼叫的地方都需要修改。
super(指定某個類名, self).父類方法():從指定類名的MRO下一級開始呼叫
super().父類方法():按照MRO順序查詢上級父類的方法。
「方法解析順序」(Method Resolution Order簡稱MRO)
可以通過類名.__MRO__屬性查找出來當前類的呼叫順序,其順序由C3演算法來決定,保證每一個類只調用一次。
單繼承用哪種方式呼叫父類方法都可以,基本上無差別,但是建議super()的方式。
super()單繼承只需要傳父類引數,但是多繼承必須傳全部引數,可以使用多值引數。
9 類屬性和例項屬性的區別
在Python中一切皆物件,類是一個特殊的物件即類物件,描述類的屬性稱為類屬性,它屬於類。類屬性在記憶體中只有一份,所有例項物件公用。在__init__外部定義。
例項屬性用來描述類創建出來的例項物件,需要通過物件來訪問,在各自物件的記憶體中都儲存一份。在__init__方法內部定義
10 例項方法、類方法、靜態方法的區別
這三種方法都是儲存在類的記憶體中,呼叫者不同。
例項方法由物件呼叫,至少一個self引數,self代表物件的引用。
類方法由類呼叫,至少一個cls引數,並且需要裝飾器@classmethod修飾
靜態方法由類呼叫,不需要引數,需要裝飾器@staticmethod修飾
11 property屬性
11.1 定義
一種用起來像是使用的例項屬性一樣的特殊屬性,可以對應於某個方法,通過使用property屬性,能夠簡化呼叫者在獲取資料的流程。
property屬性的定義和呼叫要注意以下幾點:
定義時,在例項方法的基礎上新增 @property 裝飾器;並且僅有一個self引數
呼叫時,無需括號,加上就錯了。
11.2 實現property屬性的兩種方式
11.2.1 裝飾器
經典類中的屬性只有一種訪問方式,其對應被 @property 修飾的方法,即只能讀取。
新式類中的屬性有三種訪問方式,並分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法,分別對應讀取、修改和刪除屬性的方法。
11.2.2 類屬性
當使用類屬性的方式建立property屬性時,經典類和新式類無區別
property()方法有四個引數
第一個引數是方法名,呼叫 物件.屬性 時自動觸發執行方法
第二個引數是方法名,呼叫 物件.屬性 = XXX 時自動觸發執行方法
第三個引數是方法名,呼叫 del 物件.屬性 時自動觸發執行方法
第四個引數是字串,呼叫 物件.屬性.__doc__ ,此引數是該屬性的描述資訊
12 常見的魔方屬性、方法
__doc__ 表示類的描述資訊
__module__ 表示當前操作的物件在那個模組
__class__ 表示當前操作的物件的類是什麼
__new__ 建立物件時為物件分配空間,在初始化方法__init__之前被呼叫
__init__ 初始化方法,通過類建立物件時,自動觸發執行
__del__ 當物件在記憶體中被釋放時,自動觸發執行
__call__ 物件後面加括號,觸發執行,例如物件()或者類名()()
__dict__ 類或物件中的所有屬性
__str__ 在列印物件時,預設輸出該方法的返回值(字串)
13 with與“上下文管理器”
任何實現了 __enter__() 和 __exit__() 方法的物件都可稱之為上下文管理器,上下文管理器物件可以使用 with 關鍵字。Python 提供了 with 語法用於簡化資源操作的後續清除操作,是 try/finally 的替代方法,實現原理建立在上下文管理器之上。
使用的with open(檔名) as f:這種語法可以在檔案呼叫結束或者檔案操作異常的時候自動關閉檔案