主要內容:python
1. 析構方法 __del__程序員
析構方法 : 釋放一個空間以前執行 (構造方法: 申請一個空間)面試
垃圾回收機制 class A: def __del__(self): # 析構方法 del A的對象 會自動觸發這個方法 print('執行我了',self) a = A() del a # 對象的刪除 del #先執行__del_,而後刪除a print(a) #這個時候再打印a會出現錯誤.
python解釋器內部作的事情:算法
a : 申請一塊空間,操做系統分配給你的網絡
b : 在這一塊空間以內的全部事,歸你的python解釋器來管理. 數據結構
若是某對象借用了操做系統的資源,還要經過析構方法歸還回去 : 文件資源 , 網絡資源 . app
#處理文件的 class File: def __init__(self,file_path): self.f = open(file_path) def read(self): self.f.read(124) def __del__(self): #是去歸還/釋放一些在建立對象的時候借用的一些資源 #del 對象的時候 程序員觸發 #python解釋器的垃圾回收機制 回收這個對象所佔內存的時候 python自動觸發. self.f.close() f = File('123456') f.read() # 無論是主動仍是被動,這個f對象總會被清理掉,被清理掉就觸發__del方法,觸發這個方法就會歸還操做系統的文件資源.
2. items系列 包含 :__getitem__/__setitem__/__delitem函數
irems系列和方括號有關係.優化
class A: def __getitem__(self, item): return getattr(self,item) #反射中的獲取屬性 def __setitem__(self, key, value): setattr(self,key,value) #反射中的設置屬性 #self.k1 = v1 def __delitem__(self, key): delattr(self,key) a = A() a['k1'] = 'v1' #執行__setitem__方法 print(a['k1']) #執行__getitem__方法 del a['k1'] #執行__delitem__方法 print(a['k1'])
列表操做:ui
class A: def __init__(self,lst): self.lst = lst def __getitem__(self, item): return self.lst[item] #反射中的獲取屬性 def __setitem__(self, key, value): self.lst[key] = value #反射中的設置屬性 #self.k1 = v1 def __delitem__(self, key): self.lst.pop(key) a = A([11,22,3,44,55,66]) print(a.lst[0]) print(a[0]) a[1] = 10 print(a[1]) print(a.__dict__) #{'lst': [11, 10, 3, 44, 55, 66]} a.lst.pop(1) print(a.__dict__) #{'lst': [11, 3, 44, 55, 66]}
3 . hash 方法 : 底層數據結構基於hash值尋址的優化操做
hash是一個算法,可以把某一個要存在內存的值經過一系列運算,保證不一樣的值hash結果是不同的.
對於同一個值在, 在同一次執行python代碼的時候hash值永遠不變
對於同一個值,在屢次執行python代碼的時候,hash值是不一樣的.
print(hash('12344ff')) print(hash('12344ff')) print(hash('12344ff')) print(hash('12344ff')) # 第一次執行的結果: -5787132279899563087,-5787132279899563087, -5787132279899563087,-5787132279899563087 # 第二次執行的結果: 8543566635004474721, 8543566635004474721, 8543566635004474721, 8543566635004474721 # 注意 : 同一次執行的時候,值是相同的,屢次執行值就不一樣
a : 字典的尋址
d = {'key':'v1','key1':'v2'} print(d['key'])
尋址的方式: 1) 計算key的hash值,
2) 在內存中找到該haash值所對應的value.
b : set集合的去重
set = {1,2,2,3,5,'a','b','wert2234','yuiop5654'} # 1. 先計算1所對的hash值,在計算b所對的hash值,依次計算 # 2. 若是hash值相等,判斷這兩個值是否相等 # 3. 若是相等,去重覆蓋,若是不等,則二次尋址.
去重的方式: 1)先計算每一項的hash值
2) 若是hash值相同,在判斷兩個值是否相同.
3) 若是相同,去重覆蓋,若是不一樣,則二次尋址.
4. __eq__內置方法 : == 自動觸發執行 __eq方法
class A: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def __eq__(self, other): if self.name == other.name and self.age == other.age and self.sex == other.sex: return True a = A('alex', '29', 'male') a1 = A('alex', '29', 'male') a2 = A('alex', '28', 'male') a3 = A('alex', '29', 'male') # a.func(a1) print(a == a1) # == 自動觸發__eq__方法
5 . 一道面試題
一個類 員工管理系統
對象的屬性 : 姓名 性別 年齡 部門
內部轉崗 python開發 - go開發
姓名 性別 年齡 新的部門
alex None 83 python
alex None 85 luffy
1000個員工 若是幾個員工對象的姓名和性別相同,這是一我的請對這1000個員工作去重
class Emplyee: def __init__(self, name, age, sex, department): self.name = name self.age = age self.sex = sex self.department = department def __hash__(self): #判斷姓名和性別所對應的hash值,若是不一樣就直接加到列表中,若是相同則判斷值(__eq__) return hash('%s%s' % (self.name,self.sex)) def __eq__(self, other): if self.name == other.name and self.sex == other.sex: #判斷值是否等,如相等,則執行_hash_去重覆蓋,不等就二次尋址. return True employee_list = [] # 實例化1000個員工 for i in range(200): employee_list.append(Emplyee('alex', i, 'male', 'python')) for i in range(200): employee_list.append(Emplyee('wusir', i, 'male', 'python')) for i in range(200): employee_list.append(Emplyee('sylar', i, 'male', 'python')) employee_list = set(employee_list) for person in employee_list: print(person.__dict__)
6. 模塊
a: 模塊的分類:內置模塊 :
安裝python解釋器的時候跟着裝上的方法
第三方模塊/擴展模塊 : 沒有安裝python解釋器的時候安裝的那些功能
自定義模塊 :你寫的功能若是是一個通用的功能,那就把他當成一個模塊.
b: 什麼是模塊 : 有的功能開發者本身沒法完成,這樣的話須要藉助已經實現的函數/類來完成這些功能.
你實現不了的功能別人替你實現了:
操做系統打交道; 和時間 ; 1000取隨機數 ; 壓縮一個文件; 和網絡通訊.
別人寫好的一組功能 : 文件夾/ py文件 / c語言編譯好的一些編譯文件
c: 爲何使用模塊
分類管理方法 ; 節省內存 ; 提供更多的功能
d: 模塊的建立和導入:
import my_module #my_module.py文件的內容 ''' name = 'alex' def login(): print('login', name) name = 'sylar' ''' my_module.login() # import這個語句至關於執行了什麼? # import這個模塊至關於執行了這個模塊所在的py文件
(1)import 這個語句的執行流程:
1)找到my_module這個文件
2)建立一個屬於my_module的空間
3)從上到下執行module
4)將這個模塊所在的命名空間創建一個和my_module之間的一個引用.
(2)一個模塊能夠被重複導入嗎? : 一個模塊不會被重複導入
(3)模塊的重命名 : import my_module as m
(4)導入多個模塊:
import os import my_module # PEP8規範 # 全部的模塊導入都應該儘可能放在這個文件的開頭 # 模塊的導入也是有順序的 # 先導入內置模塊 # 再導入第三方模塊 # 最後導入自定義模塊