您好,登錄后才能下訂單哦!
這篇文章主要介紹“python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”,在日常操作中,相信很多人在python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
”面向?qū)ο蟆暗暮诵氖恰皩?duì)象”二字,而對(duì)象的精髓在于“整合“
所有的程序都是由”數(shù)據(jù)”與“功能“組成,因而編寫(xiě)程序的本質(zhì)就是定義出一系列的數(shù)據(jù),然后定義出一系列的功能來(lái)對(duì)數(shù)據(jù)進(jìn)行操作。在學(xué)習(xí)”對(duì)象“之前,程序中的數(shù)據(jù)與功能是分離開(kāi)的,如下
數(shù)據(jù): name = cjk age = 18 功能: def tell_info(name, age) print('<%s:%:%s>' %(name, age)) tell_info(name,age)
在學(xué)習(xí)了“對(duì)象”之后,我們就有了一個(gè)容器,該容器可以盛放數(shù)據(jù)與功能,所以我們可以說(shuō):對(duì)象是把數(shù)據(jù)與功能整合到一起的產(chǎn)物,或者說(shuō)”對(duì)象“就是一個(gè)盛放數(shù)據(jù)與功能的容器/箱子/盒子。
如果把”數(shù)據(jù)“比喻為”球衣“、”秋衣“、”襪子“等化妝所需要的原材料;把”功能“比喻”球衣“、”秋衣“、”襪子“所需要的工具,那么”對(duì)象“就是一個(gè)收納盒,彩收納盒可以把”原材料“與”工具“都裝到一起
在了解了對(duì)象的基本概念之后,理解面向?qū)ο蟮木幊谭绞骄拖鄬?duì)簡(jiǎn)單很多了,面向?qū)ο缶幊叹褪且斐鲆粋€(gè)個(gè)的對(duì)象,把原本分散開(kāi)的相關(guān)數(shù)據(jù)與功能整合到一個(gè)個(gè)的對(duì)象里,這么做既方便使用,也可以提高程序的解耦合程度,進(jìn)而提升了程序的可擴(kuò)展性(需要強(qiáng)調(diào)的是,軟件質(zhì)量屬性包含很多方面,面向?qū)ο蠼鉀Q的僅僅只是擴(kuò)展性問(wèn)題)
類(lèi)即類(lèi)別/種類(lèi),是面向?qū)ο蠓治龊驮O(shè)計(jì)的基石,如果多個(gè)對(duì)象有相似的數(shù)據(jù)與功能,那么該多個(gè)對(duì)象就屬于同一種類(lèi)。有了類(lèi)的好處是:我們可以把同一類(lèi)對(duì)象相同的數(shù)據(jù)與功能存放到類(lèi)里,而無(wú)需每個(gè)對(duì)象都重復(fù)存一份,這樣每個(gè)對(duì)象里只需存自己獨(dú)有的數(shù)據(jù)即可,極大地節(jié)省了空間。所以,如果說(shuō)對(duì)象是用來(lái)存放數(shù)據(jù)與功能的容器,那么類(lèi)則是用來(lái)存放多個(gè)對(duì)象相同的數(shù)據(jù)與功能的容器。
綜上所述,雖然我們是先介紹對(duì)象后介紹類(lèi),但是需要強(qiáng)調(diào)的是:在程序中,必須要事先定義類(lèi),然后再調(diào)用類(lèi)產(chǎn)生對(duì)象(調(diào)用類(lèi)拿到的返回值就是對(duì)象)。產(chǎn)生對(duì)象的類(lèi)與對(duì)象之間存在關(guān)聯(lián),這種關(guān)聯(lián)指的是:對(duì)象可以訪問(wèn)到類(lèi)中共有的數(shù)據(jù)與功能,所以類(lèi)中的內(nèi)容仍然是屬于對(duì)象的,類(lèi)只不過(guò)是一種節(jié)省空間、減少代碼冗余的機(jī)制,面向?qū)ο缶幊套罱K的核心仍然是去使用對(duì)象。
在了解了類(lèi)與對(duì)象這兩大核心概念之后,我們就可以來(lái)介紹一下面向?qū)ο缶幊汤病?/p>
我們以開(kāi)發(fā)一個(gè)選課系統(tǒng)為例,來(lái)簡(jiǎn)單介紹基于面向?qū)ο蟮乃枷肴绾尉帉?xiě)程序
面向?qū)ο蟮幕舅悸肪褪前殉绦蛑幸玫降?、相關(guān)聯(lián)的數(shù)據(jù)與功能整合到對(duì)象里,然后再去使用,但程序中要用到的數(shù)據(jù)以及功能那么多,如何找到相關(guān)連的呢?我需要先提取選課系統(tǒng)里的角色:學(xué)生、老師、課程等,然后顯而易見(jiàn)的是:學(xué)生有學(xué)生相關(guān)的數(shù)據(jù)于功能,老師有老師相關(guān)的數(shù)據(jù)與功能,我們單以學(xué)生為例,
# 學(xué)生的數(shù)據(jù)有 學(xué)校 名字 年齡 性別 # 學(xué)生的功能有 選課
詳細(xì)的
# 學(xué)生1: 數(shù)據(jù): 學(xué)校=清華大學(xué) 姓名=王大錘 性別=男 年齡=28 功能: 選課 # 學(xué)生2: 數(shù)據(jù): 學(xué)校=清華大學(xué) 姓名=王二錘 性別=女 年齡=18 功能: 選課 # 學(xué)生3: 數(shù)據(jù): 學(xué)校=清華大學(xué) 姓名=王三錘 性別=男 年齡=38 功能: 選課
基于上述分析的結(jié)果,我們接下來(lái)需要做的就是在程序中定義出類(lèi),然后調(diào)用類(lèi)產(chǎn)生對(duì)象
class Student: # 類(lèi)的命名應(yīng)該使用“駝峰體” school='清華大學(xué)' # 數(shù)據(jù) def choose(self): # 功能 print('%s is choosing a course' %self.name)
類(lèi)體最常見(jiàn)的是變量的定義和函數(shù)的定義,但其實(shí)類(lèi)體可以包含任意Python代碼,類(lèi)體的代碼在類(lèi)定義階段就會(huì)執(zhí)行,因而會(huì)產(chǎn)生新的名稱(chēng)空間用來(lái)存放類(lèi)中定義的名字,可以打印Student.__dict__來(lái)查看類(lèi)這個(gè)容器內(nèi)盛放的東西
調(diào)用類(lèi)的過(guò)程稱(chēng)為將類(lèi)實(shí)例化,拿到的返回值就是程序中的對(duì)象,或稱(chēng)為一個(gè)實(shí)例
A=Student() B=Student() C=Student()
如此A,B,C全都一樣了(只有類(lèi)中共有的內(nèi)容,而沒(méi)有各自獨(dú)有的數(shù)據(jù)),想在實(shí)例化的過(guò)程中就為三位學(xué)生定制各自獨(dú)有的數(shù)據(jù):姓名,性別,年齡,需要我們?cè)陬?lèi)內(nèi)部新增一個(gè)__init__方法,如下
class Student: school='清華大學(xué)' #該方法會(huì)在對(duì)象產(chǎn)生之后自動(dòng)執(zhí)行,專(zhuān)門(mén)為對(duì)象進(jìn)行初始化操作,可以有任意代碼,但一定不能返回非None的值 def __init__(self,name,sex,age): self.name=name self.sex=sex self.age=age def choose(self): print('%s is choosing a course' %self.name)
然后我們重新實(shí)例出三位學(xué)生
A=Student('王大錘','男',28) B=Student('王二錘','女',19) C=Student('王三錘','男',18)
單拿A的產(chǎn)生過(guò)程來(lái)分析,調(diào)用類(lèi)會(huì)先產(chǎn)生一個(gè)空對(duì)象A,然后將A連同調(diào)用類(lèi)時(shí)括號(hào)內(nèi)的參數(shù)一起傳給Student.init(A,’王大錘’,’男’,28)
def __init__(self, name, sex, age): self.name = name self.sex = sex self.age = age
會(huì)產(chǎn)生對(duì)象的名稱(chēng)空間,同樣可以用__dict__查看
stu1.__dict__ {'name': '王大錘', 'sex': '男', 'age': 28}
至此,我們?cè)斐隽巳齻€(gè)對(duì)象與一個(gè)類(lèi),對(duì)象存放各自獨(dú)有的數(shù)據(jù),類(lèi)中存放對(duì)象們共有的內(nèi)容
在類(lèi)中定義的名字,都是類(lèi)的屬性,細(xì)說(shuō)的話,類(lèi)有兩種屬性:數(shù)據(jù)屬性和函數(shù)屬性,可以通過(guò)__dict__訪問(wèn)屬性的值,比如Student.dict[‘school’],但Python提供了專(zhuān)門(mén)的屬性訪問(wèn)語(yǔ)法
Student.school # 訪問(wèn)數(shù)據(jù)屬性,等同于Student.__dict__['school'] Student.choose # 訪問(wèn)函數(shù)屬性,等同于Student.__dict__['choose']
對(duì)象的名稱(chēng)空間里只存放著對(duì)象獨(dú)有的屬性,而對(duì)象們相似的屬性是存放于類(lèi)中的。對(duì)象在訪問(wèn)屬性時(shí),會(huì)優(yōu)先從對(duì)象本身的__dict__中查找,未找到,則去類(lèi)的__dict__中查找
1、類(lèi)中定義的變量是類(lèi)的數(shù)據(jù)屬性,是共享給所有對(duì)象用的,指向相同的內(nèi)存地址
# id都一樣 print(id(Student.school)) # 4301108704 print(id(A.school)) # 4301108704 print(id(B.school)) # 4301108704 print(id(C.school)) # 4301108704
2、類(lèi)中定義的函數(shù)是類(lèi)的函數(shù)屬性,類(lèi)可以使用,但必須遵循函數(shù)的參數(shù)規(guī)則,有幾個(gè)參數(shù)需要傳幾個(gè)參數(shù)
Student.choose(A) # 王大錘 is choosing a course Student.choose(B) # 王二錘 is choosing a course Student.choose(C) # 王三錘 is choosing a course
但其實(shí)類(lèi)中定義的函數(shù)主要是給對(duì)象使用的,而且是綁定給對(duì)象的,雖然所有對(duì)象指向的都是相同的功能,但是綁定到不同的對(duì)象就是不同的綁定方法,內(nèi)存地址各不相同
print(id(Student.choose)) # 4335426280 print(id(A.choose)) # 4300433608 print(id(B.choose)) # 4300433608 print(id(C.choose)) # 4300433608
綁定到對(duì)象的方法特殊之處在于,綁定給誰(shuí)就應(yīng)該由誰(shuí)來(lái)調(diào)用,誰(shuí)來(lái)調(diào)用,就會(huì)將’誰(shuí)’本身當(dāng)做第一個(gè)參數(shù)自動(dòng)傳入(方法__init__也是一樣的道理)
A.choose() # 等同于Student.choose(A) B.choose() # 等同于Student.choose(B) C.choose() # 等同于Student.choose(C)
綁定到不同對(duì)象的choose技能,雖然都是選課,但大錘選的課,不會(huì)選給二錘,這正是”綁定“二字的精髓所在。
綁定到對(duì)象方法的這種自動(dòng)傳值的特征,決定了在類(lèi)中定義的函數(shù)都要默認(rèn)寫(xiě)一個(gè)參數(shù)self,self可以是任意名字,但命名為self是約定俗成的。
Python中一切皆為對(duì)象,且Python3中類(lèi)與類(lèi)型是一個(gè)概念
到此,關(guān)于“python面向?qū)ο缶幊淘趺磳?shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。