python 鸭子类型及三大特性
python 中一切皆對象。
先說 說面向對象語言三大特性:封裝、繼承、多態(tài)。
1、封裝分兩個層面
第一層面:創(chuàng)建類和對象時,分別創(chuàng)建兩人者的名稱空間,只能通過類名加"."或者obj.的方式訪問里面的屬性方法;
第二層面:類中可以把某些屬性或方法隱藏起來,或者定義為私有,只在類內部使用,在類的外面無法訪問,或者只留下少量的接口(函數)供外部訪問。
2、繼承
python中可以多繼承,其繼承順序使用了C3算法,可以通過 類.__ mro__ 來查看
mro: method resolution order (方法解釋順序)
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class A(object):def say(self):print('AA say')class B(object):def say(self):print('BB say')class C(A):def say(self):print('CC say')class D(B):def say(self):print('DD say')class E(D, C):def say(self):print('EE say')d = E() print(E.__mro__) d.say()輸出如下:
(<class '__main__.E'>, <class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) EE say這里只是展示怎么查看多繼承的查找順序,關于繼承的復雜結構還有很多,這里就不一一列了,結構不一樣,繼承的順序也不一樣,有的廣度優(yōu)先有的深度優(yōu)先,自己試吧。
繼承的順序算法比較復雜,強烈不推薦使用這種多繼承的方式,要不然會很混亂。推薦使用Mixin的多繼承方式,即所繼承的每個類中只實現了同一種方法,不存在多方覆蓋的問題。不過若是真的設計成了多繼承的復雜結構,調試代碼時還是盡量使用mro來查看一下到底執(zhí)行了哪個父類中的屬性方法。
3、多態(tài)
python不支持多態(tài),或者說python本來就是多態(tài)語言。
鴨子類型:
Duck typing 這個概念來源于美國印第安納州的詩人詹姆斯·惠特科姆·萊利(James Whitcomb Riley,1849-
1916)的詩句:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”
上代碼,來源于網上很經典的案例:
可以看出Pseron類擁有和Duck類一樣的方法,當程序調用Duck類,并利用了其中的walk和swim方法時,我們傳入Person類也一樣可以運行,程序并不會檢查類型是不是Duck,只要他擁有 walk()和swim()方法,就能被正確地調用。
舉例:
一個對象實現了__ getitem__魔法方法,那python解釋器就會把它當做一個callection,你就可以對這個對象進行切片、獲取子項等; 如果一個對象實現了__ iter__和next方法,python就會把它當成一個iterator, 你就可以對這個對象通過循環(huán)獲取各個子項; 如果一個對象中實現了__ len__方法,你就可以對這個對象執(zhí)行l(wèi)en()對它進行計數。
結論:
面向對象是很強大的,在python編程之初我們要強制自己不要什么都用函數來實現,要多寫類,即使是很小的功能實現也用類來做,養(yǎng)成習慣,久了以后關于類和對象的相關知識自然接觸的就多,也能寫出更加復雜的程序。
總結
以上是生活随笔為你收集整理的python 鸭子类型及三大特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中如何查看模块的源码内容
- 下一篇: 用Python求出:1到某个数的奇数序列