python 面向對象 特點
-
和其它編程語言相比,Python 在儘可能不增加新的語法和語義的情況下加入了類機制。
-
Python中的類提供了面向對象編程的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法。
-
對象可以包含任意數量和類型的數據。
python 魔術方法/特殊方法/專有方法
python類中有一些方法前後都有兩個下劃線,這類函數統稱爲魔術方法。這些方法有特殊的用途,有的不需要我們自己定義,有的則通過一些簡單的定義可以實現比較神奇的功能
-
類有一個名爲 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用
-
super() 函數是用於調用父類(超類)的一個方法。
-
__private_method:兩個下劃線開頭,聲明該方法爲私有方法,只能在類的內部調用 ,不能在類的外部調用。
-
運算重載 __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則正常拋出異常