1. 查看屬性
方法: __dir__
意義: 返回類或者對象的所有成員名稱列表。dir()函數就是調用__dir__()。如果提供__dir__(),則返回屬性的列表,否則會盡量從__dict__屬性中收集信息。
如果dir([obj])參數包含方法__dict__(),該方法將被調用。如果參數不包含__dir__(),該方法將最大限度地收集參數信息。
dir()對於不同類型的對象具有不同的行為:
如果對象是模塊對象,列表包含模塊的屬性名。
如果對象是類型或者類對象,列表包含類的屬性名,及它的基類的屬性名。
否則,列表包含對象的屬性名,它的類的屬性名和類的基類的屬性名。
# animal.py
# cat.py
2. 魔術方法
分類:
創建與銷毀: __init__與__del__、hash:可哈希、bool:布爾、可視化、運算符重載、容器和大小、可調用對象、上下文管理、反射、描述器、其他雜項
方法:__hash__
意義:內建函數hash()調用的返回值,返回一個整數。如果定義這個方法該類的實例就可hash。
方法: __eq__
意義:對應於==操作符,判斷2個對象是否相等,返回bool值
__hash__方法只是返回一個hash值作為set的key,但是去重還需要__eq__來判斷2個對象是否相等。
hash值相等,只是hash沖突,不能說明兩個對象是相等的。
因此,一般來說提供__hash__方法是為了作為set或者dict的key的,所以去重需要同時提供__eq__方法。
- 練習:設計二維坐標類Point,比較2個坐標是否相等?
思考:list類為什么不可hash?
源碼中有一句__hash__=None,也就是如果調用__hash__()相當於None(),一定會報錯。
所有類都繼承自object,而這個類是具有__hash__()方法的,如果一個類不能被hash,就是把__hash__設置為None了。
方法:__bool__
意義:內建函數bool(),或者對象放在邏輯表達式的位置,調用這個函數返回布爾值。沒有定義__bool__(),就找__len__()返回長度,非0為真。如果__len__()也沒有定義,那么所有實例都返回真。
可視化:
方法:__repr__
意義:內建函數repr()對一個對象獲取字符串表達。如果一個定義了__repr()但沒有定義__str__,那么在請求該類的實例的“非正式”的字符串表示時也將調用__repr__()
方法:__str__
意義:str()函數、內建函數format、print()函數調用,需要返回對象的字符串表達
方法:__bytes__
意義:bytes的時候,返回一個對象的bytes表達,即返回bytes對象