創建:__init__
銷毀:__del__
哈希:__hash__
當__hash__ =None時,該類的實例不可哈希
hash值相同不能確定2個對象相同,要__eq__來判斷是否相同。
波爾:__bool__,返回的類型為bool,如果沒有定義__bool__,看__len__的返回長度,非0為真,如果__len__也沒定義,所有實例都返回真。
可視化:__repr__,__str__
若只定以一種,定義__repr__
運算符重載:
<:__lt__、<=:__le__、==:__eq__、>:__gt__、>=:__ge__、!=:__ne__
+:__add__、-:__sub__、*:__mul__、/:__truediv__、%:__mod__、//:__floordiv__、**:__pow__
容器方法:
__iter__:返回一個新的迭代器對象
__getitem__:實現self[key]訪問,key不存在引發異常
__setitem__:和__getitem__類似,設置值的方法
__missing__:dict使用__getitem__()調用時,key不存在不報錯,執行該方法
可調用對象:
__call__:類中定義了該方法,實例可以像函數一樣調用
類中定義了__call__,可以實現把類變成類裝飾器
上下文管理:
__enter__和__exit__都定義
__enter__的返回值會變成with語法中的變量(f)
使用 with class() as f:pass調用上下文方法。
定義了上下文管理的類,with語法可以開啟一個上下文環境,執行前做一些工作,執行后也做一些工作??梢园哑洚敵梢粋€類裝飾器。
反射:
一個對象在運行時可以找出其類型的信息。
具有反射能力的函數:type(),isinstance(),callable(),dir(),getatter()等。
內建函數:
getattr(object,name,default):通過name返回object的屬性值,當屬性不存在時,返回default,如果沒有default,則拋出AttributeError。name必須為字符串
setattr(object,name,value):object的屬性存在,則覆蓋,不存在,新增
hasattr(object,name):判斷對象是否有這個name的屬性
反射相關的魔術方法:
__getattr__():一個類的屬相會按照繼承關系找,如果找不到,就會執行__getattr__方法,如果沒有這個方法,就會拋出AttriuteError
__setattr__():可以阻止通過實例增加、修改屬性的操作。實例通過點設置屬性,如self.x=x,就會調用__setattr__(),而不會直接加到其__dict__中,屬性要加到實例的__dict__中,需要自己完成
__delattr__():可以阻止通過實例刪除屬性的操作
__getattriute__():可以阻止通過實例查找屬性的操作,實例的所有屬性訪問,都會先調用__getattriute__方法
描述器:
用到了三個魔術方法:__get__(),__set__(),__delete__()
一個類含有__get__(),__set__(),__delete__()三個方法中的任意一個,這個類就是描述器
如果僅實現了__get__(),就是非數據描述器
同時實現了__get__()和__set__()就是數據描述器
**如果一個類的類屬性是一個描述器的實例,訪問這個類屬性就會調用__get__方法**
owner就是這個類
**如果描述器是非數據描述器,這個owner的實例的字典優先級高于描述器,如果描述器是數據描述器,這個owner的實例的字典優先級低于于描述器**
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88721