20180802 個別內建方法

2022-09-06 12:48:26 字數 3810 閱讀 1580

構造方法:__new__   建立(申請)乙個空間

析構方法:__del__    釋放乙個空間(某個物件借用了作業系統的資源,還要通過析構方法歸還回去)

例如:垃圾**機制

class a:

def __del__(self): ====>(析構方法:del a的物件的時候,會自動觸發這個方法)

print("實現了del方法")

a = a()

del a ====>del 一執行的時候,就要刪除物件,刪除物件就要執行__del__析構方法,最後在刪除物件

print(a)

析構方法什麼時候執行?

(1) del物件的時候    (由程式設計師觸發的)

(2) python直譯器的垃圾**機制,**這個物件所佔的記憶體的時候   (由python自動觸發的)

在python中,當從頭執行完程式的時候,會把所有的變數從記憶體中刪除了

python直譯器內部幹的事?

python直譯器在內部就能搞定的事

申請一塊空間,作業系統會分配給乙個空間

在這一塊空間之內所有的事,歸python直譯器來管理

檔案操作

例如:

class file:

def __init__(self,file_path):

self.f = open(file_path)

def read(self):

self.f.read(2018)

def __del__(self): 去歸還/釋放一些在建立物件的時候借用的一些資源

self.f.close()

f = file("檔名")

f.read()

不管是主動還是被動,這個f物件總會被清理掉,被清理掉的時候就會觸發__del__方法,觸發這個方法就會歸還作業系統的檔案資源

f = open("檔名")       python是沒有辦法直接開啟硬碟裡面的檔案的,它需要通過作業系統為它開啟乙個空間,且這個空間內有乙個檔案操作符,也就是檔案控制代碼,此時python

才能夠對該檔案進行訪問操作          (python ---作業系統---硬碟的檔案---檔案操作符(作業系統給的))

f.close()              (關閉並歸還作業系統開啟的檔案資源)

del f                    (刪除python直譯器儲存的記憶體)

item系列和物件使用訪問之有聯絡

例如:(在內建模組中,有一些特殊的方法,要求物件必須實現__getitem__和__setitem__才能使用)

class a:

def __getitem__(self, item):

print("執行了getitem",item)

return getattr(self,item) ====>getattr(self,k)

def __setitem__(self, key, value):

return setattr(self,key,value) ====>self.k = v

a = a()

a["k"] = "v" *****>呼叫了__setitem__

print(a["k"]) *****>呼叫了__getitem__

def __delitem__(self,key):

delattr(self,key)

del a["k"] ====>呼叫了__delitem__

例如:

class b:

def __init__(self,lst):

self.lst = lst

def __getitem__(self, item):

return self.lst[item]

def __setitem__(self, key, value):

self.lst[key] = value

def __delitem__(self, key):

self.lst.pop(key)

b = b(["111","222","333","444"])

print(b.lst[0]) ====>執行__init__ 111

print(b[0]) ====>執行__getitem__ 111

b[3] = "alex" ====>執行__setitem__

print(b.lst)

del b[2] ====>執行__delitem__

print(b.lst)

底層資料結構基於hash值定址的優化操作

hash是乙個演算法,能夠把某乙個要存在記憶體裡的值通過一系列計算,保證不同值的hash結果是不一樣的

對於同乙個值在多次執行python**的時候,hash值是不同的,但是對同乙個值,在同一次執行python**的時候hash值永遠不變

set集合去重機制

去重:先判斷hash值是否一樣,hash值一樣後,在判斷值是否相等(==),如果相等的話,就直接覆蓋,如果不相等,就用其他演算法另找記憶體條儲存(二次定址)

值等於是最準確的判斷值相等的方式(==)   但是效率低下

字典的定址    (自動去重)

d =

hash  內飾函式 

hash(obj) obj內部必須實現了__hash__方法例如:

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: 判斷值是否相等,如果相等的話就返回true

return true

a = a("alex",34)

a1 = a("alex",34)

a2 = a("alex",34)

a3 = a("alex",34)

print(a == a1 == a2 == a3) ===>true (可以多值比較)

== 這個語法完全和__eq__一樣,當執行到==的時候,就觸發了__eq__這個方法

(1)首先定義乙個類

(2)物件的屬性有:姓名,性別,年齡,部門

(3)這個程式設計主要是寫員工管理系統

(4)主要是乙個人進行了內部轉崗,員工資料需要進行更新

(5) 姓名    性別     年齡     部門

alex       男        34        python

alex       男       36            go

(6)假如該公司裡面有600個員工,如果幾個員工物件的姓名和性別一樣就視為同乙個人,請對這600個員工資料做去重工作

這道面試題中主要運用到了set的去重機制:先呼叫__hash__方法,判斷名字和性別的hash值是否一樣,如果一樣後,就執行__eq__方法.判斷姓名性別的值是否相等,如果相等就直接覆蓋,如果不相等就二次定址.

8 Python指令碼學習筆記八個別細節一

8.python指令碼學習筆記八個別細節一 本篇名言 如果有夢想,就追求吧,如果有希望,就努力吧 如果有機會,就把握吧 如果有目標,就奮進吧 如果有道路,就堅持吧!如果有幸福,就珍惜吧!有些知識點,隱藏著一些讓人驚訝的特性。我們來看下。使用逗號輸出多個表示式,如下 print age 42 age ...

C語言typedef 給型別起乙個別名

c語言允許為乙個資料型別起乙個新的別名,就像給人起 綽號 一樣。起別名的目的不是為了提高程式執行效率,而是為了編碼方便。例如有乙個結構體的名字是 stu,要想定義乙個結構體變數就得這樣寫 struct stu stu1 struct 看起來就是多餘的,但不寫又會報錯。如果為 struct stu 起...

乙個不等式的別證

設 x,y,z 為正實數,且 x geq y geq z 求證 frac frac frac geq x 2 y 2 z 2 證明 因為 x geq y geq z 0 所以 frac frac frac frac frac frac frac geq 0 即 frac frac frac geq ...