Python3.5面向?qū)ο缶幊虉D文與實(shí)例詳解
本文實(shí)例講述了Python3.5面向?qū)ο缶幊?。分享給大家供大家參考,具體如下:
1、面向過(guò)程與面向?qū)ο蟮谋容^
(1)面向過(guò)程編程(procedural programming)
面向過(guò)程編程又被稱為:top-down languages,程序從上到下 一步步執(zhí)行,從頭到尾的解決問(wèn)題。
基本設(shè)計(jì)思路為:程序一開(kāi)始是解決一個(gè)大問(wèn)題,然后把大問(wèn)題分解成多個(gè)小問(wèn)題或子過(guò)程,這些小問(wèn)題執(zhí)行的時(shí)候再繼續(xù)分解,
直到小問(wèn)題足夠簡(jiǎn)單到可以在一個(gè)小范圍內(nèi)解決。
缺點(diǎn):若程序要進(jìn)行修改,則修改的部分依賴的各個(gè)部分也要修改,這樣會(huì)發(fā)生一連串的影響,隨著程序越來(lái)越大,編程方式的維護(hù)難度也會(huì)越來(lái)越高。
所以,如果寫一下簡(jiǎn)單的腳本,去做一些一次性的任務(wù),用面向過(guò)程的方式是極好的,如果要處理的任務(wù)是復(fù)雜的,且需要不斷迭代和維護(hù)的,還是用面向?qū)ο笫亲罘奖愕摹?/p>
(2)面向?qū)ο缶幊蹋╫op)
面向?qū)ο缶幊淌抢谩邦悺焙汀皩?duì)象”來(lái)創(chuàng)建各種模型來(lái)實(shí)現(xiàn)對(duì)真實(shí)世界的描述。
優(yōu)點(diǎn):可以使程序的維護(hù)和擴(kuò)展變得簡(jiǎn)單,并且可以大大提高程序的開(kāi)發(fā)效率;另外,基于對(duì)象的程序編程,可以讓別人更加理解你的代碼邏輯,是團(tuán)隊(duì)開(kāi)發(fā)變得更加從容。
核心的特征:世界萬(wàn)物皆對(duì)象,世界萬(wàn)物皆可分類。
a、類(class)
類:是對(duì)一類擁有相同屬性的對(duì)象的抽象、藍(lán)圖、原型。在類中定義了這些對(duì)象都具備的屬性、共同的方法。
b、對(duì)象(object)
對(duì)象:類實(shí)例化后的實(shí)例,一個(gè)類必須經(jīng)過(guò)實(shí)例化方能在程序中調(diào)用。
一個(gè)類可以實(shí)例化多個(gè)對(duì)象,每個(gè)對(duì)象可以有不同的屬性。人類是指使用的人,每個(gè)人是指具體的對(duì)象。
c、封裝(encapsulation)
在類中對(duì)數(shù)據(jù)的賦值、內(nèi)部調(diào)用對(duì)外部用戶是透明的,這使類變成了一個(gè)膠囊或容器,里面包含著類的數(shù)據(jù)和方法。
d、繼承(Inheritance)
一個(gè)類可以派生出子類,在這個(gè)父類里定義的屬性、方法自動(dòng)被子類繼承。
e、多態(tài)(Polymorphism)
多態(tài):是面向?qū)ο蟮闹匾匦?簡(jiǎn)單點(diǎn)說(shuō):“一個(gè)接口,多種實(shí)現(xiàn)”,指一個(gè)基類中派生出了不同的子類,
且每個(gè)子類在繼承了同樣的方法名的同時(shí)又對(duì)父類的方法做了不同的實(shí)現(xiàn),這就是同一種事物表現(xiàn)出的多種形態(tài)。
編程其實(shí)就是一個(gè)將具體世界進(jìn)行抽象化的過(guò)程,多態(tài)就是抽象化的一種體現(xiàn)。
把一系列具體事物的共同點(diǎn)抽象出來(lái), 再通過(guò)這個(gè)抽象的事物, 與不同的具體事物進(jìn)行對(duì)話。
多態(tài)允許將子類的對(duì)象當(dāng)作父類的對(duì)象使用,某父類型的引用指向其子類型的對(duì)象,調(diào)用的方法是該子類型的方法。
這里引用和調(diào)用方法的代碼編譯前就已經(jīng)決定了,而引用所指向的對(duì)象可以在運(yùn)行期間動(dòng)態(tài)綁定。
2、面向?qū)ο缶幊?/strong>
(1)無(wú)論什么形式的編程,都要明確一下原則:寫重復(fù)的代碼是非常不好的地級(jí)行為;之前寫的代碼需要不斷的更新。
所以,開(kāi)發(fā)的程序要遵循易讀、易改的原則,即:可讀性好、易擴(kuò)展。
(2)示例代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #面向?qū)ο?-CS游戲模擬 class Role(object): def __init__(self,name,role,weapon,life_value=100,money=15000): self.name = name self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): print("shotting...") def got_shot(self): print("ah...%s got shot..." %self.name) def buy_gun(self,gun_name): print("%s just bought %s" %(self.name,gun_name)) r1 = Role("Jack","police","AK-47") #實(shí)例化(初始化一個(gè)類,創(chuàng)建了一個(gè)對(duì)象) r1.buy_gun("B51") r2 = Role("Amy","terrorist","B22") r2.got_shot()
運(yùn)行結(jié)果:
Jack just bought B51
ah...Amy got shot...
注:
a、類的基本定義
第一句:定義一個(gè)類,class是定義類的語(yǔ)法,Role是類名,(object)是新式類的寫法,必須這樣寫;
第二句:__init__()
叫做初始化方法,也叫構(gòu)造方法(雖然它是函數(shù)的形式,但在類中就不叫函數(shù)了,叫做方法),在類被調(diào)用時(shí)這個(gè)方法會(huì)自動(dòng)執(zhí)行,進(jìn)行一些初始化動(dòng)作,
所以__init__(self,name,role,weapon,life_value=100,money=15000)就是要在創(chuàng)建一個(gè)角色時(shí)給它設(shè)置這些屬性。
b、實(shí)例化:把一個(gè)類變成一個(gè)具體的對(duì)象的過(guò)程叫實(shí)例化。
在這里,實(shí)例化生成一個(gè)角色,會(huì)自動(dòng)把參數(shù)傳給類Role下面的__init__(...)方法。
初始化一個(gè)角色,就需要調(diào)用這個(gè)類一次;上面的創(chuàng)建角色時(shí),并沒(méi)有給__init__(...)傳值,是因?yàn)轭愒谡{(diào)用它自己的__init__(...)是自己幫你給self參數(shù)賦值了。
執(zhí)行r1 = Role('liu','police','AK47')
時(shí),python的解釋器其實(shí)干了兩件事:
1、 在內(nèi)存中開(kāi)辟一塊空間指向r1這個(gè)變量名。
2、 調(diào)用Role這個(gè)類并執(zhí)行其中的__init__(…)
方法,相當(dāng)于Role.__init__(r1,'Jack','police','AK47')
,這么做是為什么呢?
是為了把'Jack','police','AK47'這3個(gè)值跟剛開(kāi)辟的r1關(guān)聯(lián)起來(lái),因?yàn)殛P(guān)聯(lián)起來(lái)后,你就可以直接r1.name
, r1.weapon
這樣來(lái)調(diào)用。
所以,為實(shí)現(xiàn)這種關(guān)聯(lián),在調(diào)用__init__
方法時(shí),就必須把r1這個(gè)變量也傳進(jìn)去,否則__init__
不知道要把那3個(gè)參數(shù)跟誰(shuí)關(guān)聯(lián)。
所以這個(gè)__init__(…)
方法里的,self.name = name
, self.role = role
等等的意思就是要把這幾個(gè)值 存到r1的內(nèi)存空間里。
結(jié):self就是示例本身,實(shí)例化時(shí)Python會(huì)自動(dòng)把這個(gè)示例本身通過(guò)self參數(shù)傳遞進(jìn)去。
r1.buy_gun("B51")===》Python會(huì)自動(dòng)轉(zhuǎn)換成:Role.buy_gun(r1,"B51”)
依然沒(méi)給self傳值 ,但Python還是會(huì)自動(dòng)的幫你把r1 賦值給self這個(gè)參數(shù), 為什么呢? 因?yàn)?,你在buy_gun(..)方法中可能要訪問(wèn)r1的一些其它屬性,
比如這里就訪問(wèn) 了r1的名字,怎么訪問(wèn)呢?你得告訴這個(gè)方法,于是就把r1傳給了這個(gè)self參數(shù),然后在buy_gun里調(diào)用 self.name 就相當(dāng)于調(diào)用r1.name ,
如果還想知道r1的生命值 有多少,直接寫成self.life_value就可以了。
總結(jié):
a、上面的這個(gè)r1 = Role('Alex','police','AK47')動(dòng)作,叫做類的“實(shí)例化”, 就是把一個(gè)虛擬的抽象的類,通過(guò)這個(gè)動(dòng)作,變成了一個(gè)具體的對(duì)象了, 這個(gè)對(duì)象就叫做實(shí)例。
b、剛才定義的這個(gè)類體現(xiàn)了面向?qū)ο蟮牡谝粋€(gè)基本特性,封裝,其實(shí)就是使用構(gòu)造方法將內(nèi)容封裝到某個(gè)具體對(duì)象中,然后通過(guò)對(duì)象直接或者self間接獲取被封裝的內(nèi)容。
3、實(shí)例變量與類變量
(1)類變量:存在類的內(nèi)存中,沒(méi)有實(shí)例化即可使用;實(shí)例化后,通過(guò)實(shí)例也可調(diào)用類變量。作用:共用的屬性,節(jié)省開(kāi)銷。
(2)實(shí)例變量:描述某個(gè)具體對(duì)象一些特定的屬性,只能在實(shí)例本身中使用。
(3)區(qū)別:若一個(gè)類中,既有類變量name,又有實(shí)例變量name,則先找實(shí)例變量,實(shí)例變量沒(méi)有的情況下,再找類變量。
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #面向?qū)ο?-CS游戲模擬 class Role(object): n = 123 #類變量 def __init__(self,name,role,weapon,life_value=100,money=15000): #構(gòu)造函數(shù) #作用:在實(shí)例化時(shí)做一些類的初始化工作 self.name = name #實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身 self.role = role self.weapon = weapon self.life_value = life_value self.money = money def shot(self): #類的方法(功能)--動(dòng)態(tài)屬性 print("shotting...") def got_shot(self): print("ah...%s got shot..." %self.name) def buy_gun(self,gun_name): print("%s just bought %s" %(self.name,gun_name)) #r1是類Role的一個(gè)實(shí)例化對(duì)象 # 實(shí)例化就是以類Role為模板,在內(nèi)存開(kāi)辟一塊空間,存上數(shù)據(jù),賦值成一個(gè)變量名 #實(shí)例化(初始化一個(gè)類,創(chuàng)建了一個(gè)對(duì)象) r1 = Role("Jack","police","AK-47") #此時(shí)self相當(dāng)于r1,Role(r1,"Jack","police","AK-47") r1.buy_gun("B51") #r1也被稱作Role的一個(gè)實(shí)例 r1.name = "liu" #修改r1的實(shí)例變量 r1.n = "改變類變量" #在r1中修改類變量n的值,相當(dāng)于創(chuàng)建一個(gè)n,不會(huì)影響r2 r1.bullet_prove = True #添加新的屬性,只能在r1中使用 print(r1.n) r2 = Role("Amy","terrorist","B22") #此時(shí)self相當(dāng)于r2,Role(r2,"Amy","terrorist","B22") r2.got_shot() print(r2.n) Role.n = "abc" #通過(guò)類名修改類變量的值 print("r1:",r1.n) print("r2:",r2.n)
運(yùn)行結(jié)果:
liu just bought B51
改變類變量
ah...Amy got shot...
123
r1: 改變類變量
r2: abc
4、析構(gòu)函數(shù) def __del__(self):
作用:在實(shí)例銷毀/釋放時(shí)自動(dòng)執(zhí)行,通常用于做一些收尾工作,如:關(guān)閉一些數(shù)據(jù)庫(kù)鏈接,關(guān)閉打開(kāi)臨時(shí)的文件。
析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造方法的調(diào)用順序相反。
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #面向?qū)ο?-CS游戲模擬 class Role(object): n = 123 #類變量 def __init__(self,name,role,weapon,life_value=100,money=15000): #構(gòu)造函數(shù) #作用:在實(shí)例化時(shí)做一些類的初始化工作 self.name = name #實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身 self.role = role self.weapon = weapon self.life_value = life_value self.money = money def __del__(self): #析構(gòu)函數(shù) print("%s game over..." %self.name) def shot(self): #類的方法(功能)--動(dòng)態(tài)屬性 print("shotting...") def got_shot(self): print("ah...%s got shot..." %self.name) def buy_gun(self,gun_name): print("%s just bought %s" %(self.name,gun_name)) r1 = Role("Jack","police","AK-47") r1.buy_gun("AK47") r1.got_shot() r2 = Role("Amy","terrorist","B22") r2.got_shot()
運(yùn)行結(jié)果:
Jack just bought AK47
ah...Jack got shot...
ah...Amy got shot...
Amy game over...
Jack game over...
5、私有方法、私有屬性(變量) 在變量或者方法前面添加兩個(gè)下劃線 "__",即可變成私有方法、私有屬性
私有屬性只能在類的內(nèi)部,通過(guò)self使用,在類的外部無(wú)法直接訪問(wèn)和修改其內(nèi)容。
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #面向?qū)ο?-CS游戲模擬 class Role(object): n = 123 #類變量 def __init__(self,name,role,weapon,life_value=100,money=15000): #構(gòu)造函數(shù) #作用:在實(shí)例化時(shí)做一些類的初始化工作 self.name = name #實(shí)例變量(靜態(tài)屬性),作用域就是實(shí)例本身 self.role = role self.weapon = weapon self.__life_value = life_value #私有屬性/私有變量 self.money = money def __del__(self): #析構(gòu)函數(shù) print("%s game over..." %self.name) def show_status(self): #私有屬性只能在類的內(nèi)部使用 print("name:%s weapon:%s life_val:%s" %(self.name,self.weapon,self.__life_value)) def shot(self): #類的方法(功能)--動(dòng)態(tài)屬性 print("shotting...") def got_shot(self): self.__life_value -= 50 print("ah...%s got shot..." %self.name) def buy_gun(self,gun_name): print("%s just bought %s" %(self.name,gun_name)) r1 = Role("Jack","police","AK-47") r1.buy_gun("AK47") r1.got_shot() r1.show_status()
運(yùn)行結(jié)果:
Jack just bought AK47
ah...Jack got shot...
name:Jack weapon:AK-47 life_val:50
Jack game over...
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門與進(jìn)階經(jīng)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
- Python入門篇之面向?qū)ο?/a>
- Python面向?qū)ο笾蓄悾╟lass)的簡(jiǎn)單理解與用法分析
- Python面向?qū)ο笾惡蛯?duì)象實(shí)例詳解
- Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐
- Python 面向?qū)ο?成員的訪問(wèn)約束
- Python面向?qū)ο髮?shí)現(xiàn)一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象操作示例
- Python中的面向?qū)ο缶幊淘斀?上)
- Python面向?qū)ο箢惖睦^承實(shí)例詳解
- Python?面向?qū)ο缶幊淘斀?/a>
相關(guān)文章
解決python繪圖使用subplots出現(xiàn)標(biāo)題重疊的問(wèn)題
這篇文章主要介紹了python繪圖使用subplots出現(xiàn)標(biāo)題重疊的問(wèn)題及解決方法,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04python通過(guò)BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法
這篇文章主要介紹了python通過(guò)BF算法實(shí)現(xiàn)關(guān)鍵詞匹配的方法,實(shí)例分析了BF算法的原理與Python實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03利用Python實(shí)現(xiàn)簡(jiǎn)單的相似圖片搜索的教程
這篇文章主要介紹了利用Python實(shí)現(xiàn)簡(jiǎn)單的相似圖片搜索的教程,文中的示例主要在一個(gè)圖片指紋數(shù)據(jù)庫(kù)中實(shí)現(xiàn),需要的朋友可以參考下2015-04-04Pycharm pyuic5實(shí)現(xiàn)將ui文件轉(zhuǎn)為py文件,讓UI界面成功顯示
這篇文章主要介紹了Pycharm pyuic5實(shí)現(xiàn)將ui文件轉(zhuǎn)為py文件,讓UI界面成功顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python爬蟲(chóng)實(shí)戰(zhàn)之使用Scrapy爬取豆瓣圖片
在用Python的urllib和BeautifulSoup寫過(guò)了很多爬蟲(chóng)之后,本人決定嘗試著名的Python爬蟲(chóng)框架——Scrapy.本次分享將詳細(xì)講述如何利用Scrapy來(lái)下載豆瓣名人圖片,需要的朋友可以參考下2021-06-06Python腳本Selenium及頁(yè)面Web元素定位詳解
這篇文章主要為大家介紹了Python腳本中如何使用Selenium定位頁(yè)面Web元素的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10Python實(shí)現(xiàn)數(shù)據(jù)集劃分(訓(xùn)練集和測(cè)試集)
這篇文章主要為大家詳細(xì)介紹了Python是如何實(shí)現(xiàn)數(shù)據(jù)集劃分的,分為訓(xùn)練集和測(cè)試集,文中的實(shí)現(xiàn)方法講解詳細(xì),感興趣的小伙伴可以了解一下2023-05-05