1. 程式人生 > 實用技巧 >python魔術方法注意事項

python魔術方法注意事項

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子句的變數