摘要:是一個(gè)具體的數(shù)據(jù),通過構(gòu)造函數(shù)中的參數(shù),傳給實(shí)例的屬性,在類中的另外一個(gè)方法的參數(shù)列表中第一個(gè)就是,表示要承接對象,,就是在類內(nèi)部通過對象,把它的屬性的數(shù)據(jù)傳導(dǎo)如。
上一講中創(chuàng)建了類,并且重點(diǎn)講述了構(gòu)造函數(shù)以及類實(shí)例,特別是對那個(gè)self,描述了不少。在講述構(gòu)造函數(shù)的時(shí)候特別提到,init()是一個(gè)函數(shù),只不過在類中有一點(diǎn)特殊的作用罷了,每個(gè)類,首先要運(yùn)行它,它規(guī)定了類的基本結(jié)構(gòu)。
數(shù)據(jù)流轉(zhuǎn)過程除了在類中可以寫這種函數(shù)之外,在類中還可以寫別的函數(shù),延續(xù)上一講的例子:
#!/usr/bin/env python #coding:utf-8 class Person: def __init__(self, name, lang="golang", website="www.google.com"): self.name = name self.lang = lang self.website = website self.email = "qiwsir@gmail.com" def author(self): return self.name laoqi = Person("LaoQi") info = Person("qiwsir",lang="python",website="qiwsir.github.io") print "Author name from laoqi:",laoqi.author() print "Author name from info:",info.author() #運(yùn)行結(jié)果 Author name from laoqi: LaoQi Author name from info: qiwsir
看官可能已經(jīng)注意了,這段代碼比上一講多了一個(gè)函數(shù)author(self),這個(gè)我們先不管,稍后會(huì)詳細(xì)分解。首先看看數(shù)據(jù)是如何在這個(gè)代碼中流轉(zhuǎn)的。為了能夠清楚,畫一張圖,所謂一圖勝千言萬語,有圖有真相。
定義類Person,然后創(chuàng)建實(shí)例laoqi=Person("LaoQi"),看官注意觀察圖上的箭頭方向。laoqi這個(gè)實(shí)例和Person類中的self對應(yīng),它們都是引用了實(shí)例對象(很多時(shí)候簡化說成是實(shí)例對象)。"LaoQi"是一個(gè)具體的數(shù)據(jù),通過構(gòu)造函數(shù)中的name參數(shù),傳給實(shí)例的屬性self.name,在類Person中的另外一個(gè)方法author的參數(shù)列表中第一個(gè)就是self,表示要承接self對象,return self.name,就是在類內(nèi)部通過self對象,把它的屬性self.name的數(shù)據(jù)傳導(dǎo)如author。
當(dāng)運(yùn)行l(wèi)aoqi.author()的時(shí)候,就是告訴上面的代碼,調(diào)用laoqi實(shí)例對象,并得到author()方法的結(jié)果,laoqi這個(gè)實(shí)例就自動(dòng)被告訴了author()(注意,self參數(shù)在這里不用寫,這個(gè)告訴過程是python自動(dòng)完成的,不用我們操心了),author方法就返回laoqi實(shí)例的屬性,因?yàn)榍懊嬉呀?jīng)完成了laoqi與self的對應(yīng)過程,所以這時(shí)候author里面的self就是laoqi,自然self.name=laoqi.name。
看官可以跟隨我在做一個(gè)實(shí)驗(yàn),那就是在author中,return laoqi.name,看看什么效果。因?yàn)榧热籰aoqi和self是同一個(gè)實(shí)例對象,直接寫成laoqi.name是不是也可以呢?
#!/usr/bin/env python #coding:utf-8 class Person: def __init__(self, name, lang="golang", website="www.google.com"): self.name = name self.lang = lang self.website = website self.email = "qiwsir@gmail.com" def author(self): #return self.name return laoqi.name #返回 laoqi = Person("LaoQi") info = Person("qiwsir",lang="python",website="qiwsir.github.io") print "Author name from laoqi:",laoqi.author() print "Author name from info:",info.author() #輸出結(jié)果 Author name from laoqi: LaoQi #laoqi實(shí)例輸出結(jié)果 Author name from info: LaoQi #info實(shí)例輸出結(jié)果
從結(jié)果中可以看出,沒有報(bào)錯(cuò)。但是,info這個(gè)實(shí)例輸出的結(jié)果和laoqi實(shí)例輸出的結(jié)果一樣。原來,當(dāng)調(diào)用了info實(shí)例之后,運(yùn)行到author(),返回的是laoqi.name。所以,這里一定要用self實(shí)例。在調(diào)用不同的實(shí)例時(shí),self會(huì)自動(dòng)的進(jìn)行匹配,當(dāng)然,匹配過程是python完成,仍然不用我們操心。
OK,數(shù)據(jù)流轉(zhuǎn)過程,看官是否理解了呢?下面進(jìn)入方法編寫的環(huán)節(jié)
為什么要用到方法在類里面,可以用def語句來編寫函數(shù),但是,通常這個(gè)函數(shù)的樣子是這樣的:
class ClassName: def __init__(self,*args): ... def method(self,*args): #是一個(gè)在類里面的函數(shù) ...
在類ClassName里面,除了前面那個(gè)具有初始化功能的構(gòu)造函數(shù)之外,還有一個(gè)函數(shù)method,這個(gè)函數(shù)和以前學(xué)習(xí)過的函數(shù)一樣,函數(shù)里面要寫什么,也沒有特別的規(guī)定。但是,這個(gè)函數(shù)的第一個(gè)參數(shù)必須是self,或者說,可以沒有別的參數(shù),但是self是必須寫上并且是第一個(gè)。這個(gè)self參數(shù)的作用前面已經(jīng)說過了。
這樣看來,類里面的這個(gè)函數(shù)還有點(diǎn)跟以前函數(shù)不同的地方。
類里面的這個(gè)函數(shù),我們就稱之為方法。
之所以用方法,也是用類的原因,也是用函數(shù)的原因,都是為了減少代碼的冗余,提高代碼的重用性,這也是OOP的原因。
方法怎樣被重用呢?看本最開始的那段代碼,里面有一個(gè)author方法,不管是laoqi還是info實(shí)例,都用這個(gè)方法返回實(shí)例導(dǎo)入的名字。這就是體現(xiàn)了重用。
編寫和操作方法編寫方法的過程和編寫一個(gè)函數(shù)的過程一樣,需要注意的就是要在參數(shù)列表中第一個(gè)寫上self,即使沒有其它的參數(shù)。
#!/usr/bin/env python #coding:utf-8 class Person: def __init__(self, name, lang="golang", website="www.google.com"): self.name = name self.lang = lang self.website = website self.email = "qiwsir@gmail.com" def author(self, address): #return self.name return laoqi.name+" in "+address laoqi = Person("LaoQi") info = Person("qiwsir",lang="python",website="qiwsir.github.io") print "Author name from laoqi:",laoqi.author("China") print "Author name from info:",info.author("Suzhou") #運(yùn)行結(jié)果 Author name from laoqi: LaoQi in China Author name from info: LaoQi in Suzhou
這段代碼中,對author方法增加了一個(gè)參數(shù)address,當(dāng)調(diào)用這個(gè)方法的時(shí)候:laoqi.author("China"),要對這個(gè)參數(shù)賦值,看官特別注意,在類中,這個(gè)方法顯示是有兩個(gè)參數(shù)(self,address),但是在調(diào)用的時(shí)候,第一個(gè)參數(shù)是自動(dòng)將實(shí)例laoqi與之對應(yīng)起來,不需要顯化賦值,可以理解成是隱含完成的(其實(shí),也可以將laoqi看做隱藏的主體,偷偷地更self勾搭上了)。
通過上面的講述,看官可以試試類了。提醒,一定要對類的數(shù)據(jù)流通過程清晰。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/37392.html
摘要:從運(yùn)行結(jié)果可以看出,當(dāng)子類繼承多個(gè)父類的時(shí)候,對于構(gòu)造函數(shù),只有第一個(gè)能夠被繼承,第二個(gè)就等掉了。重點(diǎn)看,類繼承了,同時(shí),在構(gòu)造函數(shù)中自己做了規(guī)定,也就是的構(gòu)造函數(shù)是按照的意愿執(zhí)行,不執(zhí)行的內(nèi)容,但是,還有一個(gè)方法,則繼承了這個(gè)方法。 在上一講代碼的基礎(chǔ)上,做進(jìn)一步修改,成為了如下程序,請看官研習(xí)這個(gè)程序: #!/usr/bin/env python #coding:utf-8 c...
摘要:在對象接口后包裝其實(shí)現(xiàn)的細(xì)節(jié),從而隔離了代碼的修改對用戶產(chǎn)生的影響。類提供了一個(gè)新的本地作用域,最小化了變量名沖突。類其實(shí)并沒有結(jié)束,不過本講座到此對類暫告一段。 前面對類的有關(guān)內(nèi)容已經(jīng)描述不少了,其實(shí)話題遠(yuǎn)遠(yuǎn)沒有結(jié)束,不過對于初學(xué)者,掌握這些已經(jīng)算是入門,在以后的實(shí)踐中,還需要進(jìn)行體會(huì)和感悟。 這幾天和幾個(gè)朋友以各種途徑討論過OOP的相關(guān)問題,他們是:令狐蟲、Frank、晉劍、小馮...
摘要:運(yùn)行繼承的父類運(yùn)行結(jié)果這回運(yùn)行結(jié)果有了變化,本來是運(yùn)行類,但是繼承了,并且在初始化的構(gòu)造函數(shù)中,引入的構(gòu)造函數(shù),所以,就運(yùn)行的結(jié)果相應(yīng)結(jié)果了。 關(guān)于類,看官想必已經(jīng)有了感覺,看下面的代碼,請仔細(xì)閱讀,并看看是否能夠發(fā)現(xiàn)點(diǎn)什么問題呢? #!/usr/bin/env python #coding:utf-8 class Person: def __init__(self, na...
摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語句幾點(diǎn)說明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關(guān)系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...
摘要:關(guān)于函數(shù)的事情,總是說不完的,下面就羅列一些編寫函數(shù)的注意事項(xiàng)。函數(shù)具有獨(dú)立性。也就是常說的不要有太強(qiáng)的耦合性。要讓函數(shù)能夠獨(dú)立于外部的東西。函數(shù)實(shí)現(xiàn)的功能和目標(biāo)要單一化。這跟前面的道理是一樣的,目的是降低耦合性。 關(guān)于函數(shù)的事情,總是說不完的,下面就羅列一些編寫函數(shù)的注意事項(xiàng)。特別聲明,這些事項(xiàng)不是我總結(jié)的,我是從一本名字為《Learning Python》的書里面抄過來的,順便寫成...
閱讀 2397·2021-08-26 14:14
閱讀 2730·2019-08-29 13:07
閱讀 2142·2019-08-26 11:44
閱讀 734·2019-08-26 10:11
閱讀 2473·2019-08-23 15:43
閱讀 3144·2019-08-23 14:17
閱讀 455·2019-08-23 12:36
閱讀 2279·2019-08-22 15:20