23 析構方法 items系列 hash方法 eq方法

主要內容: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規範
# 全部的模塊導入都應該儘可能放在這個文件的開頭
# 模塊的導入也是有順序的
    # 先導入內置模塊
    # 再導入第三方模塊
    # 最後導入自定義模塊
相關文章
相關標籤/搜索