python面向對象 魔術方法/特殊方法/專有方法

python 面向對象 特點

  1. 和其它編程語言相比,Python 在儘可能不增加新的語法和語義的情況下加入了類機制。

  2. Python中的類提供了面向對象編程的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法。

  3. 對象可以包含任意數量和類型的數據。

 

python 魔術方法/特殊方法/專有方法

python類中有一些方法前後都有兩個下劃線,這類函數統稱爲魔術方法。這些方法有特殊的用途,有的不需要我們自己定義,有的則通過一些簡單的定義可以實現比較神奇的功能

  1. 類有一個名爲 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用

  2. super() 函數是用於調用父類(超類)的一個方法。

  3. __private_method:兩個下劃線開頭,聲明該方法爲私有方法,只能在類的內部調用 ,不能在類的外部調用。

  4. 運算重載  __add__: 加運算 __sub__: 減運算__mul__: 乘運算__truediv__: 除運算__mod__: 求餘運算__pow__: 乘方 。。。

看到一個比較詳細的總結

https://zhuanlan.zhihu.com/p/31161355

簡單功能

這部分包括上面列出的前兩個點

不需要修改直接調用的,主要有如下幾個

  • __dict__ 類和實例都可以調用這個方法
    • 類調用返回這個類中已經定義了的屬性和方法,包括特殊方法
    • 實例調用返回屬性的字典
  • __module__ 類和實例都可以調用,類所在的模塊,比如aa文件夾下的bb.py文件中則返回 aa.bb
  • __class__ 只有實例可以調用,表明實例屬於哪個類,內容包括了__module__的信息
  • dir()函數 作用於類和實例上,返回它所有的屬性和方法,實際上相當於調用了__dir__()函數

一般進行簡單定義之後使用的方法

  • __doc__ 返回定義類時標註的字符串,標註位置必須在定義的方法屬性之前,默認是None
  • __slots__ = ('name', 'age') 加一句這個可以只允許定義這兩個屬性,無法在實例中添加,這條命令只對當前類起作用,對子類無效
  • __init__ 用於定義實例屬性
  • __call__ 輸入 實例() 或者 類()() 觸發,只有定義了這個,實例纔可以像函數一樣後面加括號
  • __str__ print實例時打印出來的內容,不定義可以調用,重新定義後則可以定製打印內容
  • __repr__ 直接輸出實例名打印出來的內容,不定義可以調用,重新定義後則可以定製打印內容
  • __new__ 創建實例時自動調用 __del__ 對象在內存中被釋放時觸發(後面不設置例子)
  • __len__ 定義 len(實例) 返回的內容,比如字符串類就定義的是字符串的字符個數,當然也可以改成其他的
  • __eq__ 改變==運算符的行爲,定義實例使用==number時,是拿實例的什麼與number相比
  • 和eq類似的還有ne lt le gt ge
  • 還有一些用於實例之間數值計算的 __add__ __abs__等方法,定義方式和__eq__差不多,這些應用的典型類就是數值類,定義這些其實定義了某些運算符的行爲,比如__iadd__定義了+=的行爲一樣。除此之外還有轉化爲整數、浮點,
  • __getattr__ 當實例訪問的屬性未被定義時,原來會報錯,定義了這個之後就會按照這裏定義的來輸出. setattr 則可以設置屬性 delattr則刪除屬性

可迭代對象

使實例成爲可迭代對象(可以被for循環的)

  • 實現 __iter__ __next__ 方法
  • 如果只實現__iter__則這個方法的返回值必須是一個迭代器
  • 也可以__iter__返回一個self,再定義__next__方法,接受self爲參數,在裏面具體實現如何取得下一個值以及迭代器何時結束
  • 原理是當對實例調用for循環時,相當於每次對__iter__的返回結果作用一次next()函數,所以要想迭代必須定義__iter__方法。第一種就是next每次正常調用__iter__返回的值,這就要求它的返回值是一個迭代器;第二種則是把next函數改掉,使其功能不再是找到下一個,而是定製我們想要的一些操作

上下文管理

實現上下文管理,即可以和with結合使用

  • 要實現 __enter__ __exit__ 兩個方法
  • __enter__會返回一個值,並賦值給as關鍵詞之後的變量
  • __exit__ 定義了處理結束後要做的事情,比如文件的關閉,socket的斷開等
  • 更深入地使用:__exit__中可以處理異常。
    • 在上下文管理中運行的代碼如果報錯,會將三個值自動傳入__exit__方法中,分別爲 異常的類型,異常的值,異常的追蹤棧
    • 通過定義__exit__的返回值可以進行不同的處理,共有兩種返回形式,返回True則這個異常忽略,返回None則正常拋出異常

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章