1. 程式人生 > >面向對象-雙下方法

面向對象-雙下方法

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不是每次都觸發,只有哈希值相等的時候才觸發

面向對象-雙下方法