面向對象-雙下方法
阿新 • • 發佈:2018-08-05
spa app 解釋器 emp aps eee 處理 註意 pre
一.析構方法:__del__ :釋放一個空間之前執行
用處:某對象借用了操作系統的資源,要通過析構方法歸還回去 (垃圾回收機制)
操作系統資源:文件資源,網絡資源
class A: def __del__(self): #析構方法,del A的對象,會自動觸發這個方法 print(‘執行方法‘) a = A() del a #對象的刪除 del print(a) #找不到a 會報錯
#處理文件例子 class File: def __init__(self,file_path): self.f = open(‘file_path‘) self.name = ‘alex‘ def read(self): self.f.read(1024) def __del__(self):#去歸還/釋放一些在創建對象的時候借用的一些資源 #del 對象的時候 程序員觸發(主動) #python解釋器的垃圾回收機制 回收這個對象所占的內存的時候 python自動觸發的 self.f.close() f= File(‘文件名‘) f.read() #不管是主動還是被動,這個f對象總會被清理掉,被清理掉就觸發__del__方法,觸發這個方法就會歸還操作系統#的文件資源
註意:f.close 是釋放操作系統打開的文件資源 del f 是釋放python解釋器的內存
二.item系列: 和對象使用[]訪問值有關
用處:在一些內置模塊中,有一些特殊的方法,要求對象必須實現__getitem__/__setitem__才能使用
class A: def __getitem__(self, item): return getattr(self,item) def __setitem__(self, key, value): setattr(self,key,value) def __delitem__(self,key): delattr(self,key) a = A() print(a.__dict__) a[‘k‘] = ‘v‘ print(a.__dict__) print(a[‘k‘]) del a[‘k‘] print(a.__dict__) #結果: {} {‘k‘: ‘v‘} v {}
三.__hash__/__sq__
hash方法:底層數據結構基於hash值尋址的優化操作,hash是一個算法,能夠把某一個要存在內存裏的
值通過一系列計算,保證不同值的hash結果是不一樣的.
記住:對同一值多次執行python代碼的時候hash值是不一樣的
對同一值一次性執行python代碼的時候hash值永遠不變
ps:字典的key基於哈希算法,set集合去重機制也是基於hash算法
set集合去重機制:先通過哈希算法,取到一個空間,看裏面有沒有值,沒有就填進去,有就在對值進行比較.不一樣的話,進行二次尋址,,一樣的話,覆蓋.
hash(obj):obj內部必須實現__hash__方法
__eq__ ==這個語法是完全和__eq__相關的,__eq__返回的所有值都是當成布爾值來查看
class A: def __init__(self,name,age): self.name = name self.age = age a = A(‘張三‘,20) a1 = A(‘張三‘,20) print(a == a1)
#結果:Flase #判斷的是內置地址所以為Flasd
class A: def __init__(self,name,age): self.name = name self.age = age def __eq__(self, other): #判斷對象的值是否相等 if self.name == other.name and self.age == other.age: return True a = A(‘張三‘,20) a1 = A(‘張三‘,20) print(a==a1) #結果:True
一道面試題
一個類 # 對象的屬性 : 姓名 性別 年齡 部門 # 員工管理系統 # 內部轉崗 python開發 - go開發 # 姓名 性別 年齡 新的部門 # alex None 83 python # alex None 85 luffy 600個員工 # 如果幾個員工對象的姓名和性別相同,這是一個人 # 請對這600個員工做去重 class Employee: def __init__(self,name,age,sex,partment): self.name = name self.age = age self.sex = sex self.partment = partment def __hash__(self): return hash(‘%s%s‘%(self.name,self.sex)) def __eq__(self, other): if self.name == other.name and self.sex == other.sex: return True employ_lst = [] for i in range(200): employ_lst.append(Employee(‘alex‘,i,‘male‘,‘python‘)) for i in range(200): employ_lst.append(Employee(‘wusir‘,i,‘male‘,‘python‘)) for i in range(200): employ_lst.append(Employee(‘taibai‘, i, ‘male‘, ‘python‘)) # print(employ_lst) employ_set = set(employ_lst) for person in employ_set: print(person.__dict__)View Code
set的去重機制:先調用hash,在調用eq,eq不是每次都觸發,只有哈希值相等的時候才觸發
面向對象-雙下方法