構造方法:__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:不管是主動還是被動,這個f物件總會被清理掉,被清理掉的時候就會觸發__del__方法,觸發這個方法就會歸還作業系統的檔案資源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 = 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:底層資料結構基於hash值定址的優化操作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結果是不一樣的
對於同乙個值在多次執行python**的時候,hash值是不同的,但是對同乙個值,在同一次執行python**的時候hash值永遠不變
set集合去重機制
去重:先判斷hash值是否一樣,hash值一樣後,在判斷值是否相等(==),如果相等的話,就直接覆蓋,如果不相等,就用其他演算法另找記憶體條儲存(二次定址)
值等於是最準確的判斷值相等的方式(==) 但是效率低下
字典的定址 (自動去重)
d =
hash 內飾函式
hash(obj) obj內部必須實現了__hash__方法例如:
class a:== 這個語法完全和__eq__一樣,當執行到==的時候,就觸發了__eq__這個方法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 (可以多值比較)
(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 ...