python魔術方法注意事項
阿新 • • 發佈:2020-08-07
new
- 永遠是靜態方法
- 需要一個返回值,如果返回值不是cls的例項,則不會呼叫__init__
- 返回值一般是例項物件,需要呼叫object來例項化物件,則返回值必然是super().new(cls)
str
- 視覺化方法,用字串的可視方式展示,但是本質不是字串
- str()、format()、print()的三個函式直接呼叫__str__,如果沒有__str__則去呼叫__repr__
repr
- 視覺化方法,對一個物件用字串視覺化方式表達
- 除str()、format()、print()三個方法都直接呼叫__repr__
如果父類沒有,則按照該規則與繼承規則往上找
bytes
- 返回一個bytes物件,如果需要bytes返回,則一定要return bytes物件
hash
- 返回一個整數,如果有該方法,則例項就可以雜湊
- set去重需要滿足兩個條件,一是可hash,二是兩個值需要內容相等,內容相等則需要呼叫__eq__方法
- 如果類中沒有__eq__方法,則在==比較時預設比較的id值
eq
- 判斷兩個物件內容是否相等
- 類中有了__eq__,就必須有__hash__定義,否則該類的例項都不可以hash
- list中定義了 def hash(self): return None 所以list不能hash
bool
- 定義例項的bool型別
- 返回值只能是False或者True
- 如果沒有定義,則找__len__,非0為真
運演算法過載
- 如果沒有__isub__則,-=的運算子會找__sub__
__isub__與__sub__的區別
- sub是進行相減並返回了新的值,返回新值後將原值覆蓋 類似於
a.attr = a.attr b.attr
- isub是先進行相減,但是最後return了self,但是屬性做了變化,類似於
- a.attr = a.attr - b.attr
return self - list 的+=類似於呼叫了extend()方法,並作為返回值
- 不可變型別,+=呼叫的=
enter__與__exit
- with上下文管理器在進入時會呼叫__enter__方法,執行結束後會執行__exit__方法,with語句塊中異常都不會打破__exit__的執行
- with語句會呼叫__enter__方法,如果有as,將該方法的返回值賦值給as子句的變數