【Python基礎入門系列】第10天:Python 類與對象

? ?首先,我已經假定你是個萌新或已經看了無數遍的垃圾文章,然后依然搞不懂類和對象,但是呢起碼知道有類和對象這么兩個玩意兒,我覺得有必要找一篇生動形象的示例來講解。

由于你可能沒有編程經驗,

所以無法從學過的編程語言里通過類比去理解Python的‘類和對象’。咱們用生活中的例子來說說:

比如你是玩具廠的工程師,你要制作一個機器,可以批量制作鴨子形狀的玩具,也許你的思路如下:


def makeDuckMoth():#這里可以放其他制作細節 print('鴨子嘴巴制作完畢')
def makeDuckEar(): #這里可以放其他制作細節 print('鴨耳朵制作完畢')
def makeDuckEye(): #這里可以放其他制作細節 print('鴨眼睛制作完畢')
def makeDuckHead(): #這里可以放其他制作細節print('鴨頭制作完畢')
def makeDuckWing():#這里可以放其他制作細節print('鴨翅膀制作完畢')
def makeDuckBody():#這里可以放其他制作細節print('鴨身體制作完畢')
def makeDuckFoot(): #這里可以放其他制作細節print('鴨腳制作完畢')
def makeDuckMerge():#這里可以放其他制作細節 
print('鴨子組裝完畢')
makeDuckMoth() #制作鴨嘴巴
makeDuckEar() #制作鴨耳朵
makeDuckEye() #制作鴨眼睛
makeDuckHead() #制作鴨頭
makeDuckWing() #制作鴨翅膀,##注意,豬是沒有翅膀的makeDuckBody() #制作鴨身體makeDuckFoot() #制作鴨腳makeDuckMerge() #合并鴨子的各個部位,組裝成最終鴨子
你發現,自己好厲害,居然學會了整個鴨子的制作流程

?

第二天,老板讓你,制作豬形狀的玩具,難道你的代碼如下:???

 
def makePigMoth():#這里可以放其他制作細節print('豬嘴巴制作完畢')
def makePigEar():#這里可以放其他制作細節print('豬耳朵制作完畢')
def makePigEye():#這里可以放其他制作細節print('豬眼睛制作完畢')
def makePigHead():#這里可以放其他制作細節print('豬頭制作完畢')
def makePigBody():#這里可以放其他制作細節print('豬身體制作完畢')
def makePigHand():#這里可以放其他制作細節print('豬手制作完畢')
def makePigFoot():#這里可以放其他制作細節 print('4只豬腳制作完畢')
def makePigMerge(): #這里可以放其他制作細節print('豬組裝完畢')
makePigMoth() #制作豬嘴巴
makePigEar() #制作豬耳朵
makePigEye() #制作豬眼睛
makePigHead() #制作豬頭
makePigBody() #制作豬身體
makePigFoot() #制作4只豬腳
makePigMerge() #合并豬的各個部位,組裝成最終豬
 

這樣來,你確實完成了工作,但有沒有覺得 有點累?

是不是覺得,豬和鴨子有很多相似之處?

如果你學會了,類的用法,可以非常輕松,下面是類的用法

??

?等等?我先說說

?

  1. 類、對象在實際編程中有啥好處,為啥要用它們

  2. 再給你解釋怎么去理解它們

?

? ?類的好處主要有

  • 方便復用(如果你用函數寫,就要復制整塊代碼,增加了代碼量,增加了出錯率)

  • 方便擴展(函數寫段代碼,若要升級、擴展,都十分復雜,容易出錯,用類來擴展,則方便清晰)

  • 方便維護(因為類是把抽象的東西映射成我們常見的,摸得到的東西,容易理解,維護也方便)

?

?

? ? 舉幾個例子理解:

類就像是基因的制造圖紙,我們人類,生的小孩,也是兩只手,兩只腳,一個嘴巴,除非變異,否則不會多出一只腳的,之所以這樣有序的發展,是因為我們身體里,有基因這張圖紙控制著我們的繁衍


現在我們給上面例子中的制作 鴨子、豬 建立一個通用的制作基因表,利用他們相似制作流程?

建立基因表


class Animal(object):''' 豬和鴨子的基類(基因圖紙表) '''def __init__(self, name):# 實例化的時候傳入要制作的東西名字,如豬、鴨子 self.name = name def makeMoth(self):#這里可以放其他制作細節print(self.name+'的嘴巴 制作完畢')#這里的self.name就是獲取我們傳入的namedef makeEar(self):#這里可以放其他制作細節print(self.name+'的耳朵 制作完畢')def makeEye(self): #這里可以放其他制作細節 print(self.name+'的眼睛 制作完畢')def makeHead(self): #這里可以放其他制作細節print(self.name+'的頭 制作完畢')def makeBody(self): #這里可以放其他制作細節 print(self.name+'的身體 制作完畢')def makeFoot(self): #這里可以放其他制作細節print(self.name+'的腳 制作完畢')def makeMerge(self): #這里可以放其他制作細節print(self.name+'合并完畢')def makeAll(self): # 一條龍。直接跑完整個流水線self.makeMoth()self.makeEar()             self.makeEye()self.makeHead() self.makeBody() self.makeFoot()    self.makeMerge()

?

你可以看到,上面的圖紙里,我們沒有放?makeWing() #制作翅膀,那是因為豬不會飛,我們只放豬和鴨子共有的、相同的東西接下來,用這個類,繼承給Pig


代碼如下


class Pig(Animal):# 括號里寫Animal,意思是Pig繼承Animal的所有特性,類似你繼承你老爸的基因def makeMoth(self): #這里加詳細的豬嘴巴制作流程,如長嘴巴,有兩個孔 print(self.name+'的嘴巴 制作完畢')def makeEar(self): #耳朵大大的print(self.name+'的耳朵 制作完畢')def makeEye(self): #眼睛小小的print(self.name+'的眼睛 制作完畢')def makeHead(self): #很大的頭 print(self.name+'的頭 制作完畢')def makeBody(self): #略 print(self.name+'的身體 制作完畢')def makeFoot(self): #略 print(self.name+'的腳 制作完畢')def makeMerge(self): #略 print(self.name+'合并完畢')

?

在class Pig中,如 makeMoth函數方法里面,只加入詳細制作豬嘴巴的代碼,不要把制作豬頭的代碼放這里哦

你發現,class Pig中 沒有了這2段代碼,這是因為,

如果你繼承別的對象,如Animal后,若完全不修改某些方法屬性,就可以不寫出來(實際還是存在Pig中的)


def __init__(self, name): self.name = name
def makeAll(self): # 一條龍。直接跑完整個流水線 self.makeMoth() self.makeEar()self.makeEye()self.makeHead()self.makeBody()    self.makeFoot() self.makeMerge()
 

?

寫出來意味著,你要覆蓋以前代碼塊里的行為,如 :

我們寫出了makeMoth,makeEar ...

意味著我們要把makeMoth里的制作細節改成我們想要的,

豬和鴨子的嘴巴長得不一樣,制作細節肯定不同,對吧?

?

最后我們用以下代碼,讓機器開始造豬

pig1 = Pig('豬') #實例化,相當于懷孕
pig1.makeAll() # 開始造豬,相當于在子宮里形成整體

?

現在開始造鴨子的圖紙,繼承Animal,覆蓋某些代碼


class Duck(Animal): #def makeMoth(self): #這里加詳細的鴨子嘴巴制作流程,如長嘴巴,嘴巴硬print(self.name+'的嘴巴 制作完畢')def makeEar(self): #耳朵很小 print(self.name+'的耳朵 制作完畢')def makeEye(self): #眼睛小小的 print(self.name+'的眼睛 制作完畢')def makeHead(self): #頭很小 print(self.name+'的頭 制作完畢')def makeBody(self): #略 print(self.name+'的身體 制作完畢')def makeFoot(self): #略 print(self.name+'的腳 制作完畢')def makeMerge(self): #略 print(self.name+'合并完畢')def makeWing(self): #增加翅膀的制作流程 #略 print(self.name+'的翅膀 制作完畢')def makeAll(self): #因為增加了翅膀,所以要覆寫這個函數 self.makeMoth() self.makeEar()         self.makeEye() self.makeHead() self.makeBody() self.makeFoot() self.makeWing() #插入翅膀制作流程 self.makeMerge()

然后用以下代碼實例化,開始做鴨子

duck1 = Duck('鴨子')duck1.makeAll()

?

?

以后我們要狗、牛、企鵝,都可以從Animal繼承, ?Animal給我們提供了一個框架,我們只需要在這個框架上,擴展,延伸 就可以很方便的做出任何東西,這就是類的魅力

?

?

如果你要做個別的咋辦?

可以建立一個?足夠通用基類,慢慢擴展, 類似人類的老祖宗,最開始是微生物,后來是猴子

 

?

class Weishengwu(object):    '''假設一開始的老祖宗只會吃東西'''    def __init__(self, name):????????????self.name?=?name????????def?eat(self):???????????print('吃東西')#開始進化成魚類class?Fish(Weishengwu):????'''在老祖宗只會吃的基礎上,學會了移動'''????def?move(self):???????????print('移動')#開始進化成猴子class?Houzi(Fish):????'''在魚的基礎上學會了爬樹'''?????def?__init__(self,?name,?love):??#?以前只有名字,現在有了愛好,或許是吃桃子、或許是蕩秋千?? ????????self.name?=?name??????????? ????????self.love?=?love????????def?eat(self):????????#覆寫,因為吃東西的方式可能和魚類不一樣了???????????print('牙齒吃東西')????def?move(self):????????#覆寫,不是在水里移動了,是陸地上移動?????????????????print('腳移動')???????def?Pashu(self):?????????        ??print('爬樹')#你可以繼續進化,繼續給他增加任何功

?

總結

希望可以通過這個生動而形象的示例,幫到你懂得 Python 類與對象的定義和使用。最后再給你個生動形象的比喻,希望你能理解。

????類(class): 相當于施工圖紙(blueprint)

????對象(object):房子(已經建造好的)

?

參考:

https://www.runoob.com/python3/python3-namespace-scope.html

https://www.zhihu.com/search?type=content&q=python%E4%B8%8E%E5%AF%B9%E8%B1%A1

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455866.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455866.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字電子技術課程設計之基于觸發器的三位二進制同步減法計數器無效態000/110

基于觸發器的三位二進制同步減法計數器無效態000/110 1 課程設計的目的與作用 掌握用multisim 的電路仿真程序 熟悉同步計數器工作原理和邏輯功能 熟悉計數器電路的分析和設計方法 掌握161 芯片集聯成任意進制同步加法計數器 2 設計任務 三位二進制減法計數器(無…

SUSE11 搭建iscsi target 配置

https://www.suse.com/documentation/sles11/stor_admin/data/sec_inst_system_iscsi_target.html#sec_inst_system_iscsi_target_manual https://www.novell.com/support/kb/doc.php?id7001308 http://scst.sourceforge.net/comparison.html轉載于:https://www.cnblogs.com/b…

圖像、幀、片、NALU(firstime)

圖像、幀、片、NALU 是學習 H.264 的人常常感到困惑的一些概念,我在這里對自己的理解做一些闡述,歡迎大家討論:H.264 是一次概念的革新,它打破常規,完全沒有 I 幀、P幀、B 幀的概念,也沒有 IDR 幀的概念。對…

【Python的黑魔法】實例方法、靜態方法和類方法

class Bird:# classmethod修飾的方法是類方法classmethoddef fly (cls):print(類方法fly: ,cls)# staticmethod修飾的方法是靜態方法# staticmethoddef info (p):print(靜態方法info: , p)if __name__ __main__:# 調用類方法,Bird類會自動綁定到第一個參數Bird.fl…

基于dreamweaver軟件設計和開發一網站_基于 abp vNext 和 .NET Core 開發博客項目 Blazor 實戰系列(一)...

系列文章使用 abp cli 搭建項目給項目瘦身,讓它跑起來完善與美化,Swagger登場數據訪問和代碼優先自定義倉儲之增刪改查統一規范API,包裝返回模型再說Swagger,分組、描述、小綠鎖接入GitHub,用JWT保護你的API異常處理和…

CSS邊框,背景,邊距,溢出

CSS邊框,背景,邊距,溢出 css邊框屬性 border:寬度 樣式 顏色; border-color; border-style; 邊框樣式:solid實現,dotted點狀線,dashed虛線CSS3的樣式 border-radius:圓角處理 box-shadow: x軸偏移 y軸偏移 模糊度 擴散成都 顏色…

LINUX 內存使用情況

# free 顯示結果如下: Mem:表示物理內存統計 total 內存總數 8057964KBused 已使用的內存 7852484KBfree 空閑的內存數 205480KBshared 當前已經廢棄不用,總是0buffers Buffer 緩存內存數: 290432KBcached Page 緩存內存數:5735024KB(存在關…

vagrant系列教程(四):vagrant搭建redis與redis的監控程序redis-stat(轉)

閱讀目錄 下載redis解壓redis編譯安裝redis配置redisredis開機自啟動系統參數的調整上一篇php7環境的搭建 真是火爆,僅僅兩天時間,就破了我之前swagger系列的一片文章,看來,大家對搭建環境真是情有獨鐘。 為了訪問量,我…

sps及pps在解碼器內傳遞過程

首先解碼器中有一個全局變量seq_parameter_set_rbsp_t SeqParSet[MAXSPS];// MAXSPS32,它是一個指向序列參數集的數組。還有一個全局變量seq_parameter_set_rbsp_t *active_sps;主要為后續解碼所用。解碼器先將碼流中的數據讀入臨時指針sps,之后存入全局…

【技術分享】Ubuntu下使用微信教程

做后端開發的同學用的Linux(ubuntu),肯定會因為沒有適配微信版本會感覺不太舒服,很多時候因為缺少一些辦公通訊軟件而感到不便。現在已經有很方便的Wine WeChat方案,但是微信在Wine上配置還有許多bug,今天在github上看…

python join函數_Python join()函數

原博文 2016-08-12 10:16 ? 今天寫python 100例時,有個題目是大致是這樣的:已知輸入形式是1321,要求輸出形式為1123 一開始思路是將輸入的字符串用split()函數劃分成數組,在對數組進行排序,再用for循環輸出 代碼附上&…

CSS中的盒子

盒子 盒子模型解釋元素在頁面中顯示成一個方塊,類似一個盒子,CSS盒子模型就是使用現實中盒子來做比喻,幫助我們設置元素對應的樣式。盒子模型示意圖如下: 把元素叫做盒子,設置對應的樣式分別為:盒子的邊框…

分享Kali Linux 2017年第17周鏡像文件

分享Kali Linux 2017年第17周鏡像文件 Kali Linux官方于4月23日發布2017年的第17周鏡像。這次維持了11個鏡像文件的規模。默認的Gnome桌面的4個鏡像,E17、KDE、LXDE、MATE、XFCE桌面的各一個,手機版的包括ARMEL和ARMHF。有最近要安裝Kali Linux系統的&am…

Djang重新整理migrations,解決:Django Table xxx already exist

在開發過程中,由于需求變更或者自我重構,需要清理migrations,以保持代碼整潔和后續的可維護性。 場景一 不考慮數據庫數據表,可以完全清空數據庫里面的表的數據。 步驟: 刪除所有migrations find . -path "/migr…

安全隨筆2:對稱加密應用場景

MD5或者說HASH值是一種不可逆的算法。如果需要從密文還原成明文,那么就需要對稱和非對稱這兩類可逆算法。 首先,簡單介紹下這兩類算法。圖9-1是對稱算法的示意圖: 圖9-1 對稱算法 在對稱算法中,首先需要發送方和接收方協定一個密鑰…

python安裝多久_python安裝與使用

1、進入官網下載python軟件 python-3.4.4.amd64.msi http://www.python.org/download/ 這個軟件包含三個環境,如下圖:2、雙擊安裝軟件 3、設置環境變量path";C:\Python34"; 4、驗證是否安裝成功 進入cmd中,輸入python,如果出現如下…

HADAMARD變換

for (j0;j<16;j) { for (i0;i<16;i) { M1[ i ][j]imgY_org[img->opix_yj][img->opix_xi]-img->mprr_2[k][j][ i ]; 計算當前宏塊殘差塊 M0[i%4][i/4][j%4][j/4]M1[ i ][j]; } } current_intra_sad_20; //…

CSS中的塊元素,內聯元素,內聯塊元素

塊元素,內聯元素,內聯塊元素 元素就是標簽&#xff0c;布局中常用的有三種標簽&#xff0c;塊元素、內聯元素、內聯塊元素&#xff0c;了解這三種元素的特性&#xff0c;才能熟練的進行頁面布局。 塊元素塊元素&#xff0c;也可以稱為行元素&#xff0c;布局中常用的標簽如&…

django 與 vue 的完美結合

最近接到一個任務&#xff0c;就是用django后端&#xff0c;前段用vue&#xff0c;做一個普通的簡單系統&#xff0c;我就是一搞后端的&#xff0c;聽到vue也是比較震驚&#xff0c;之前壓根沒接觸過vue。看了vue的一些文檔&#xff0c;還有一些項目&#xff0c;先說一下django…

東芝確定半導體重組計劃:保留閃存其他全賣

會計丑聞給日本東芝公司的業績帶來嚴重影響&#xff0c;為了提高盈利&#xff0c;東芝正在對旗下的半導體、個人電腦、白色家電等業務進行一次重大重組。據日經新聞1月23日報道&#xff0c;東芝已經正式制定了芯片業務重組的詳細計劃&#xff0c;除了占據優勢的閃存芯片之外&am…