Python-淺談Python2與Pyt
- 2020 年 1 月 10 日
- 筆記
在Python2版本中編寫類時,默認不加載object。那加載object和不加載object的區別在哪裡呢?
一是擁有的高級特性不同。
繼承object可以擁有許多高級特性,這些高級特性是編寫框架和大型項目時需要使用的,十分有用。
鏈接https://blog.csdn.net/DeepOscar/article/details/80947155中有繼承object與不繼承object兩者特性的詳細的表格
二是調用順序不同。
繼承了object的是新式類,不繼承 object 的是經典類,在 Python 2 裏面新式類和經典類在多繼承調用順序方面會有差異。具體而言就是經典類按照深度優先進行調用,而新式類遵循廣度優先進行調用。
比如下面的代碼,深度優先調用就是先從D->B->A->C,而廣度優先則是D->B->C->A。
具體的調用順序按照mro列表順序,可以使用mro()函數來查看mro列表。
class A(object): pass class B(A): pass class C(A): pass class D(B,C): pass d=D() print(D.mro()) >>>[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
順便一提,查找父類的函數super()實際上和父類並沒有關係,它返回的是MRO列表中的下一個類。因此在單線程的類中返回的就是上一級的父類而已。
一般而言,使用新式類對多繼承的處理更符合邏輯,所以基於這兩點提倡大家在創建類時繼承object。
在Python3的版本中,新建的類默認加載了object(即使你不寫object),即擁有object的特性和廣度優先的調用特點。但是基於書寫規範,建議大家還是在類的後面添加上object。
感謝
知乎作者鄒沖:https://www.zhihu.com/question/19754936/answer/202650790