一.屬性訪問函式
在編寫一個類以後,她所存在的屬性和方法,我們可以呼叫。但有時我們不清楚他是否存在這樣的屬性,所以我們可以進行校驗。例如下圖我們只編寫了name屬性,沒有編寫sex屬性,所以我們在使用sex屬性時會報錯。
1.hasattr(例項物件,屬性)
判斷屬性是否存在,返回值是bool型別,True是存在,False是不存在
2.getattr(例項物件,屬性)
得到屬性值,沒有則報錯,返回值是屬性值
3.setattr(例項物件,屬性)
設定屬性值,無返回值——None
4.delattr(例項物件,屬性)
透過簡單 if 判斷就能避免屬性不存在時,報錯的問題,同時也可以設定屬性值
三目運算
二.內建方法操作屬性
1.物件.getattribute(屬性)
獲取該例項物件的指定屬性值,返回屬性值,沒有就報錯
2.物件.setattr(屬性,屬性值)
設定該例項物件的屬性值,增加或修改,無返回值
3.物件.delattr(屬性)
三.屬性呼叫過程
首先判斷是python自動完成的
若有屬性,物件.getattribute(屬性)就會返回屬性值;
若沒有屬性則物件.getattr(屬性),若類有定義該方法,則執行定義的方法;若類沒有定義該方法,則會報錯
四.物件方法關係
1.內建函式(判斷)
(1) issubclass (類,類)
判斷第一個類是不是後面類的子類(object是所以子類的父類),第二個引數可以是一個元組(只要符合元組中的任意一個就會返回True,否則返回False)
(2)isinstance(物件,類)
判斷例項是否是後面類的例項
所有的資料型別都是一個類(int,str,list,set,dic),具體的值,都是類的例項。##判斷單個用type,判斷多個用 isinstance
五.魔法方塊
Python中很多內建方法都是兩個下劃線在兩邊,中間是單詞名字,並且這樣的方法名字有一定的特殊的含義,把這種方法都稱之為魔法方法
比如這裡的__new__方法,就是最開始呼叫的一個方法,會在初始化之前自動呼叫。__init__在建立例項的時候自動呼叫,__del__被析構時會呼叫。
1.單例模式:為了最佳化程式碼,類始終只有一個例項存在,節約空間
利用__new__方法,可以很方便的去實現一個類的單例模式
單例模式的意思是:類始終只有一個例項存在,不會同時出現多個例項
2.輸出魔法方法
__str__ : 修改print列印時的樣子__repr__ : 修改直接列印時的樣子
六.協議
類似於我們實際生活中的合同,按照規定提供相應的功能。
序列協議即定義__len__,__getitem__,__setitem__,__delitem__等協議,如果不需要改變,那後兩個就不要定義
Python中有很多的協議,比如序列協議等很多協議,只要遵守這些協議,既可以說是對應的型別,比如定義了序列型別協議,則定義的類就是序列型別
(1)列舉函式(enumerate)
(2)迭代器協議
讓我們的類變成可迭代的類,能夠使用for迴圈迭代
只要類實現了__iter__ 和 next 方法,則這個類就是迭代器,因此只要實現這兩個方法,則是可以迭代物件
(3)上下文協議
讓我們的類能使用with關鍵字
我們之前講過的with的使用,只要類裡面定義__enter__和__exit__這兩個方法,則可以使用with去使用此物件,如下計算程式執行時所用的時間
文中的 exc_type,exc_val,exc_tb 必須存在,with關鍵字縮排裡面的程式碼之前會執行__enter__協議方法縮排裡面的程式碼執行完會執行__exit__方法。