標籤:無法 例子 互連網應用 開頭 對象 優點 汽車 修改 程式
一 物件導向初識
Python要麼是面向過程要麼是物件導向。
概念及優缺點:
面向過程的程式設計的核心是過程,過程即解決問題的步驟,面向過程的設計就好比精心設計好一條流水線,考慮周全什麼時候處理什麼東西。
優點是:極大的降低了程式的複雜度
缺點是:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即便是能,也得是大改,改一個組件,牽一髮而動全身。
應用情境:一旦完成基本很少改變的情境,著名的例子有Linux內核,git,以及Apache HTTP Server等。
物件導向的程式設計的核心是對象,要理解對象為何物,必須把自己當成上帝,上帝眼裡世間存在的萬物皆為對象,不存在的也可以創造出來。物件導向的程式設計好比如來設計西遊記,如來要解決的問題是把經書傳給東土大唐,如來想了想解決這個問題需要四個人:唐僧,沙和尚,豬八戒,孫悟空,每個人都有各自的特徵和技能(這就是對象的概念,特徵和技能分別對應對象的資料屬性和方法屬性),然而這並不好玩,於是如來又安排了一群妖魔鬼怪,為了防止師徒四人在取經路上被搞死,又安排了一群神仙保駕護航,這些都是對象。然後取經開始,師徒四人與妖魔鬼怪神仙互動著直到最後取得真經。如來根本不會管師徒四人按照什麼流程去取。
物件導向的程式設計
優點是:解決了程式的擴充性。對某一個對象單獨修改,會立刻反映到整個體系中,如對遊戲中一個人物參數的特徵和技能修改都很容易。
缺點:可控性差,無法向面向過程的程式設計流水線式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由對象之間的互動解決問題,即便是上帝也無法預測最終結果。於是我們經常看到一個遊戲人某一參數的修改極有可能導致陰霸的技能出現,一刀砍死3個人,這個遊戲就失去平衡。
應用情境:需求經常變化的軟體,一般需求的變化都集中在使用者層,互連網應用,企業內部軟體,遊戲等都是物件導向的程式設計大顯身手的好地方
物件導向的程式設計並不是全部。對於一個軟體品質來說,物件導向的程式設計只是用來解決擴充性。
二 類和對象
python中一切皆為對象,且python3統一了類與類型的概念,類型就是類,所以,不管你信不信,你已經使用了很長時間的類了
1 >>> dict #類型dict就是類dict2 <class ‘dict‘>3 >>> d=dict(name=‘luchuan‘) #執行個體化4 >>> d.pop(‘name‘) #向d發一條訊息,執行d的方法pop5 ‘luchuan‘6 >>>
基於物件導向設計一個款遊戲:英雄聯盟,每個玩家選一個英雄,每個英雄都有自己的特徵和和技能,特徵即資料屬性,技能即方法屬性,特徵與技能的結合體就一個對象。
從一組對象中提取相似的部分就是類,類也是特徵與技能的結合體,特徵即資料並且是所有對象共用的資料,技能即函數屬性並且是所有對象共用的函數屬性。
註:現實生活中,先有了原形人物,才有了類。
python編程中,是先有了類,再有了對象,例如dict。
先定義類,由類產生具體得對象。類是提取了共同的特徵和技能組成得。什麼等於什麼,這是特徵。技能就是功能。
三、類相關知識
3.1 初識類
在python中聲明函數與聲明類很相似
聲明函數
1 def functionName(args):2 ‘函數文檔字串‘3 函數體
聲明類
1 ‘‘‘2 class 類名:3 ‘類的文檔字串‘4 類體5 ‘‘‘6 7 #我們建立一個類8 class Data:9 pass
大前提:1.只有在python2中才分新式類和經典類,python3中統一都是新式類2.新式類和經典類聲明的最大不同在於,所有新式類必須繼承至少一個父類3.所有類甭管是否顯式聲明父類,都有一個預設繼承object父類(講繼承時會講,先記住)在python2中的區分經典類:class 類名: pass經典類:class 類名(父類): pass在python3中,上述兩種定義方式全都是新式類經典類與新式類
在本節開頭介紹得出結論,類是資料與函數的結合,二者稱為類的屬性
class Garen: #定義英雄蓋倫的類,不同的玩家可以用它執行個體出自己英雄; camp=‘Demacia‘ #所有玩家的英雄(蓋倫)的陣營都是Demacia; def attack(self,enemy): #普通攻擊技能,enemy是敵人; enemy.life_value-=self.aggressivity #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值。
3.2.1 類有兩種作用:屬性引用和執行個體化
屬性引用(類名.屬性)
>>> Garen.camp #引用類的資料屬性,該屬性與所有對象/執行個體共用‘Demacia‘>>> Garen.attack #引用類的函數屬性,該屬性也共用<function Garen.attack at 0x101356510>>>> Garen.name=‘Garen‘ #增加屬性>>> del Garen.name #刪除屬性
3.2.2 執行個體化(__init__與self)
類名加括弧就是執行個體化,會自動觸發__init__函數的運行,可以用它來為每個執行個體定製自己的特徵
class Garen: #定義英雄蓋倫的類,不同的玩家可以用它執行個體出自己英雄; camp=‘Demacia‘ #所有玩家的英雄(蓋倫)的陣營都是Demacia; def __init__(self,nickname,aggressivity=58,life_value=455): #英雄的初始攻擊力58...; self.nickname=nickname #為自己的蓋倫起個別名; self.aggressivity=aggressivity #英雄都有自己的攻擊力; self.life_value=life_value #英雄都有自己的生命值; def attack(self,enemy): #普通攻擊技能,enemy是敵人; enemy.life_value-=self.aggressivity #根據自己的攻擊力,攻擊敵人就減掉敵人的生命值。
執行個體化:類名+括弧
>>> g1=Garen(‘草叢倫‘) #就是在執行Garen.__init__(g1,‘草叢倫‘),然後執行__init__內的代碼g1.nickname=‘草叢倫’等
self的作用是在執行個體化時自動將對象/執行個體本身傳給__init__的第一個參數,self可以是任意名字,但是瞎幾把寫別人就看不懂了。
這種自動傳遞的機制還體現在g1.attack的調用上,後續會介紹。
一:我們定義的類的屬性到底存到哪裡了?有兩種方式查看dir(類名):查出的是一個名字列表類名.__dict__:查出的是一個字典,key為屬性名稱,value為屬性值二:特殊的類屬性類名.__name__# 類的名字(字串)類名.__doc__# 類的文檔字串類名.__base__# 類的第一個父類(在講繼承時會講)類名.__bases__# 類所有父類構成的元組(在講繼承時會講)類名.__dict__# 類的字典屬性類名.__module__# 類定義所在的模組類名.__class__# 執行個體對應的類(僅新式類中)類屬性的補充
類屬性的補充
3.3 對象/執行個體只有一種作用:屬性引用
python基礎之物件導向初識