python極簡教程07:封裝、多型和繼承 - IT人

文章推薦指數: 80 %
投票人數:10人

測試奇譚,BUG不見。

這一場主講python的物件導向部分——封裝、多型和繼承。

目的:掌握Python物件導向的三個核心概念。

封裝01 什麼是封裝? Togglenavigation IT人 IT人 python極簡教程07:封裝、多型和繼承 測試奇譚發表於 2022-01-17 Python 測試奇譚,BUG不見。

這一場主講python的物件導向部分——封裝、多型和繼承。

目的:掌握Python物件導向的三個核心概念。

封裝 01什麼是封裝? 封裝的目的是,保護隱私。

通俗的講:不想讓別人知道你的東西。

於是,便有了兩個概念:普通屬性(變數)和私有屬性(變數)。

02為什麼要用封裝? 當你不希望外界可以直接修改一些資料時。

比如使用者的身份證號等資訊屬於使用者的隱私,肯定不能直接暴露給外界直接訪問或修改,那麼就不能把它作為普通屬性,應該作為私有屬性。

03怎麼使用封裝? 看下面這個例子就夠了。

#!/usr/bin/python #-*-coding:utf-8-*- classUser: def__init__(self,name,id_card): #普通屬性 self.name=name #私有屬性(雙下劃線) self.__id_card=id_card defget_id_card(self): returnself.__id_card classStudent(User): definit(self,name,id_card): #普通屬性 self.name=name #私有屬性 self.__id_card=id_card #例項化一個User類 user=User('張三',511011199505050101) stu=Student('李四',511011199505050808) #print(user.__id_card) #不能直接訪問私有屬性,會報錯:AttributeError:'User'objecthasnoattribute'__age' print(user.get_id_card()) #可以通過成員方法去訪問私有屬性 print(user._User__id_card) #也可以通過“_類名__私有屬性名”進行訪問 多型 01什麼是多型? 多型指同一個實體同時具有多種形式。

它是物件導向程式設計(OOP)的一個重要特徵。

同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。

多型一般要通過繼承和重寫方法去實現。

太難理解? 說簡單點:一類事物(動物)有多種形態(貓,狗,豬等)。

02有什麼用? 增加了程式的靈活性和擴充套件性,不論物件怎麼變,呼叫方式不變。

太難理解? 那先了解下Python的多型實現,再來理解。

首先,Python的多型是基於鴨子型別實現。

什麼是鴨子型別? 如果一種動物只要行為有相似性,那麼我們就可以認為是鴨子。

比如:鴨子會走路和游泳,是鴨子;人也會走路和游泳,也是“鴨子” classduck(): defwalk(self): print('Iwalk,iamaduck') defswim(self): print('iswim,iamaduck') classperson(): defwalk(self): print('iwalklikeaduck') defswim(self): print('iswimlikeaduck') defwatch_duck(a): a.walk() a.swim() small_duck=duck() watch_duck(small_duck) #Iwalk,iamaduck #iswim,iamaduck duck_like_man=person() watch_duck(duck_like_man) #iwalklikeaduck #iswimlikeaduck watch_duck接收這個類的物件,但並沒有檢查物件的型別,便直接呼叫物件的walk和swim方法。

多型的靈活性和擴充套件性,便在於它關注的是呼叫物件如何被使用,而並不關注物件本身是什麼。

即,我只關心你是否會走路和游泳,而不關心你究竟是誰。

說回靈活性和擴充性。

當你再想增加一個類,比如狗,它也會走路和游泳。

你只需要增加一個Dog類就可以了。

classDog(): defwalk(self): print('iwalklikeaduck') defswim(self): print('iswimlikeaduck') 繼承 01繼承和過載 什麼是繼承? 動物需要吃和喝,貓繼承自動物,則貓會吃和喝。

什麼是過載? 動物需要吃和喝,貓繼承自動物,則貓會吃和喝,但是貓喝水是用舔的,因此需要特殊處理(過載)一下。

classAnimal: defeat(self): print("animaleat") defdrink(self): print("animaldrink") classCat(Animal): defdrink(self): print("catdrinkbylick") cat=Cat() cat.eat() cat.drink() 02多繼承 什麼是多繼承? 小花是一個大學生(繼承自學生),在校期間,她兼職做家教(繼承自老師),於是,小花有兩個能力(學習和教書)。

繼承順序(MRO查詢) Python支援多繼承,但是有繼承順序: 菱形繼承【類似廣度優先查詢】 classD: defget(self): print("I'mD") classB(D): pass classC(D): defget(self): print("I'mC") classA(B,C): pass a=A() a.get() #I'mC 樹型繼承【類似深度優先查詢】 classO: defget(self): print("I'mO") classP: defget(self): print("I'mP") classZ(O): pass classY(P): pass classX(Z,Y): pass x=X() x.get() #I'mO Python用C3演算法處理多繼承問題,我們可以用_mro_來檢視繼承順序。

print(A.__mro__) #(,,,,) print(X.__mro__) #(,,,,,) 一如既往,做個總結 01封裝可以理解為保護隱私; 02多型的關鍵是鴨子型別,明白了鴨子型別,理解多型不再困難; 03繼承可用,但多繼承需要慎用,如果你非用不可,那必須得研究清楚繼承的層次結構; 04以上三點,是物件導向的核心,也是你日後工作中,會經常用到的,so,它們很重要。

相關文章 要不要學Python?如何快速學Python? 2022-01-14 Python Python技術分享:Python學習的一些小技巧! 2022-01-14 Python 中國式報表搞不定?教程來了! 2022-01-14 python極簡教程06:生成式和裝飾器 2022-01-14 Python MicroPython8266配置 2022-01-14 Python Python與Javascript相互呼叫超詳細講解(2022年1月最新)(一)基本原理Part1-通過子程式和程式間通訊(IPC) 2022-01-15 PythonJavaScriptIPC Python求解谷歌高速公路招聘廣告:{無理數e中前十位連續的素數}.com 2022-01-15 Python Python函式與lambda表示式(匿名函式) 2022-01-15 Python python分支結構與迴圈結構 2022-01-15 Python Python與Javascript相互呼叫超詳細講解(2022年1月最新)(三)基本原理Part3-通過C/C++聯通 2022-01-16 PythonC++JavaScript 用js玩轉Scriptable,超簡單教程 2022-01-16 10個常用的Python影像處理工具,非常全了! 2022-01-17 Python 學Python可以用來幹什麼? 2022-01-17 Python 從頭造輪子:python3asyncio之gather(3) 2022-01-17 Python 什麼是Python?Python語言支援哪幾種程式設計方式? 2022-01-17 Python Python為什麼不設計do-while迴圈結構? 2022-01-17 Python 最新文章 CMR:印度手機遊戲調查報告 大咖說·圖書分享|HaaS物聯網裝置雲端一體開發框架 話實踐,行實幹,成實事:“巡禮”數字化的中國大地 構建安全程式碼防止供應鏈攻擊 【推薦閱讀】超有用的漏洞掃描工具合集! 國密SM演算法有哪些? 為什麼伺服器選擇Linux系統 ApacheFlinkML2.1.0釋出公告 乾貨|作為前端開發者如何邁向獨立開發者 助力開發者,全方位解讀APISIX測試案例 得物資料庫中介軟體平臺“彩虹橋”演進之路 KubeSphere3.3.0離線安裝教程



請為這篇文章評分?