pyhton學(xué)習(xí)與數(shù)據(jù)挖掘self原理及應(yīng)用分析
對(duì),你沒(méi)看錯(cuò),這是我初學(xué) python 時(shí)的靈魂發(fā)問(wèn)。
我們總會(huì)在class里面看見(jiàn)self,但是感覺(jué)他好像也沒(méi)什么用處,就是放在那里占個(gè)位子。
如果你也有同樣的疑問(wèn),那么恭喜你,你的class沒(méi)學(xué)明白。
所以,在解釋self是誰(shuí)之前,我們先明確幾個(gè)問(wèn)題:
- 什么是class,什么是instance?
- 什么是object? 什么是method,什么是function?
一個(gè)畫外音,我個(gè)人是比較反對(duì)在編程中,對(duì)本來(lái)是英文的專有名詞進(jìn)行中文翻譯的。正所謂語(yǔ)言塑造了思維,因此一些專有名詞一旦翻譯過(guò)來(lái),無(wú)論你翻譯的多好,總會(huì)有一定程度的語(yǔ)意模糊。比如說(shuō)“class”,我們?cè)诳吹竭@個(gè)詞的瞬間會(huì)聯(lián)想到“課”,但是翻譯過(guò)來(lái)就是“類”,于是我們會(huì)不自覺(jué)地,去按照“課”或者“一大類”去理解這個(gè)專有名詞。這是一種非常嚴(yán)重的潛在的誤導(dǎo),因?yàn)閏lass這個(gè)專有名詞和“課”或者“一大類”關(guān)系都不太大。所以還不如不翻譯,就當(dāng)不知道這個(gè)詞啥意思,在學(xué)習(xí)的過(guò)程中再慢慢理解他代表的意思。
其實(shí)因?yàn)橛⑽牡木窒扌?,很多編程語(yǔ)言里的專屬名詞也是大佬們一拍腦袋,瞎起的。。比如我吐槽了無(wú)數(shù)次的matplotlib里面的axes。。。
又說(shuō)多了。。?;氐秸}。
1. 什么是class,什么是instance,什么是object?
Class: 可以理解為一個(gè)組裝工廠。假如我們要生產(chǎn)一個(gè)機(jī)器人,那我們先要搭個(gè)工廠吧。先確定:我們要先安裝胳膊,再安裝頭,我們的小破機(jī)器人的流水線就搭好了。這個(gè)工廠比較智能,胳膊和頭的數(shù)量都可以調(diào)。
class BuildRobot(): def __init__(self,armcount,headcount): self.armcount = armcount self.headcount = headcount
所以這里的class,就是搭了一個(gè)工廠叫BuildRobot。'__init__' 就是告訴這個(gè)流水線,首先你需要這個(gè)機(jī)器人有幾個(gè)胳膊(‘a(chǎn)rmcount'),有幾個(gè)腦袋(‘headcount')。先忽略一下這里的self,以后講。
這個(gè)時(shí)候你可以run一下,這樣你的class就搭好了。可是這時(shí)的工廠,因?yàn)槟銢](méi)有開(kāi)始生產(chǎn),是沒(méi)有任何產(chǎn)出的。下面就是instance
instance:可以理解為啟動(dòng)一次工廠生產(chǎn)出的機(jī)器人。現(xiàn)在我們用之前搭的工廠生產(chǎn)一個(gè)正常一點(diǎn)的機(jī)器人,兩個(gè)胳膊一個(gè)腦袋:
normal_robot = BuildRobot(2,1)
查看一下胳膊數(shù)對(duì)不對(duì)?
我們?cè)賮?lái)一個(gè) 不太正常的機(jī)器人:
weird_robot = BuildRobot(4,1)
normal_robot 和weird_robot 都是instance。他們雖然胳膊數(shù)量不一樣,但是本質(zhì)上都是由這個(gè)class造出來(lái)的,由胳膊和頭組成的機(jī)器人。
object: 這個(gè)就比較麻煩了,大部分情況下,object和instance的含義是一樣的,都是指這個(gè)造出來(lái)的robot。這兩者的區(qū)別,只是在英語(yǔ)語(yǔ)言環(huán)境下的區(qū)別:
normal_robot is an instance of ‘buildrobot'
normal_robot is a ‘buildrobot' object
上面這兩個(gè)說(shuō)法是等價(jià)的。
2. 什么是method,什么是function?
兩者都由def定義,稍微粗糙一點(diǎn)的理解就是,在class里面的function叫method。所以,method是和class,instance有關(guān)的一種function。
舉個(gè)栗子:
還是上面的工廠,我們現(xiàn)在加裝一個(gè)車間,負(fù)責(zé)把胳膊上色:
class BuildRobot(): def __init__(self,armcount,headcount): self.armcount = armcount self.headcount = headcount def paintarm(self,color): print("paint arm:",color)
這個(gè)paintarm,就是一個(gè)method。還是一樣,現(xiàn)在這個(gè)class沒(méi)有生產(chǎn),因此這個(gè)method也沒(méi)有任何實(shí)際的產(chǎn)品出來(lái)。我們只能先生產(chǎn)出一個(gè)instance來(lái):
colorful_robot = BuildRobot(2,1)
好的我們現(xiàn)在有一個(gè)兩個(gè)胳膊一個(gè)頭的robot了。這時(shí),我們的robot還是沒(méi)有上色的,因?yàn)槲覀儧](méi)有讓這個(gè)instance進(jìn)入上色的那個(gè)車間?,F(xiàn)在我們讓這個(gè)robot進(jìn)入車間,涂個(gè)紅色。
colorful_robot.paintarm('red')
paint arm: red
上面的過(guò)程,就是call這個(gè)paintarm method。幾個(gè)點(diǎn):
如果沒(méi)有先造一個(gè)機(jī)器人,這個(gè)車間就沒(méi)有辦法給胳膊上色,因此要上色,就必須先造一個(gè)機(jī)器人出來(lái)。所以,method是依賴于instance的。
這個(gè)車間只能給這個(gè)工廠產(chǎn)出的robot的胳膊上色,你從別的工廠拿一個(gè)車過(guò)來(lái)讓他上色,他是不干的。因此,method是依賴于class的。只有這個(gè)class創(chuàng)建的instance,才能call這個(gè)method。
假如我把上色這個(gè)活,外包了。我就在外面另建了個(gè)工廠,專門上色,這就是function:
def outsourcing_paint(robot,color): print("paint",robot,"arm:",color) outsourcing_paint(colorful_robot,'red')
paint <__main__.BuildRobot object at 0x116b434a8> arm: red
這個(gè)外包的上色工廠,不管你這個(gè)東西是從哪個(gè)工廠來(lái)的,無(wú)論你是個(gè)機(jī)器人還是機(jī)器狗,反正我就拿來(lái),給胳膊上色。
看到這里,應(yīng)該就明白function和method的區(qū)別了。
注意method其實(shí)有兩種,一種是instance method,一種是class method。
- instance method就相當(dāng)于對(duì)于機(jī)器人這個(gè)產(chǎn)品進(jìn)行各種修改的車間。我給機(jī)器人上色,不影響我這個(gè)工廠的外形對(duì)吧?
- class method,是對(duì)這個(gè)工廠,這個(gè)class的屬性進(jìn)行修改的車間,比如我有一個(gè)車間負(fù)責(zé)把工廠涂成紅色的。這個(gè)行為并不影響我造出來(lái)的機(jī)器人的大小顏色屬性。
本篇的討論,我們先限定在instance method里。
3. 重點(diǎn)SELF分析
把class, method講明白以后,終于能講self了。通過(guò)上面的例子,我們注意到
outsourcing_paint(colorful_robot,'red')
- 在function里面,是沒(méi)有self的。因?yàn)槲覀兏嬖V了外包工廠,給誰(shuí)上色。所以在定義外包工廠function時(shí),我們有兩個(gè)input variables:robot 和 color。
colorful_robot.paintarm('red')
- 然鵝在使用method的時(shí)候,我們只告訴了車間,我要紅色。那這個(gè)車間怎么知道,給哪個(gè)機(jī)器人上色啊?是給normal robot還是給colorful robot?因?yàn)槲覀冊(cè)赾all這個(gè)method的時(shí)候,使用了colorful_robot.paintarm()這個(gè)格式,于是paintarm這個(gè)method就知道,哦,我要給這個(gè)colorful_robot上色。
- 在python里,要想使instance.method()這個(gè)格式可以正常工作,在class里面編寫method的時(shí)候,就必須把變量的第一個(gè)位子留出來(lái),用來(lái)指代未來(lái)call這個(gè)method的instance。就相當(dāng)于我們?cè)诖罱ńo胳膊上色的這個(gè)車間的時(shí)候,就必須預(yù)留一個(gè)入口來(lái)放入已經(jīng)生產(chǎn)出來(lái)的機(jī)器人。
- 留出來(lái)的這個(gè)位子,可以叫任何名字。只不過(guò)為了代碼的優(yōu)美,大部分人選擇使用self,來(lái)指代使用這個(gè)method的instance他自己。
總結(jié)
- self是在為class編寫instance method的時(shí)候,放在變量名第一個(gè)位子的占位詞。
- 在具體編寫instance method里,可以不使用self這個(gè)變量。
- 如果在method里面要改變instance的屬性,可以用self.xxxx來(lái)指代這個(gè)屬性進(jìn)行修改。
所以self, 就是指由這個(gè)class造出來(lái)的instance嘛。
以上就是pyhton學(xué)習(xí)與數(shù)據(jù)挖掘self原理及應(yīng)用分析的詳細(xì)內(nèi)容,更多關(guān)于pyhton數(shù)據(jù)挖掘self分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python數(shù)據(jù)挖掘使用Evidently創(chuàng)建機(jī)器學(xué)習(xí)模型儀表板
- python學(xué)習(xí)與數(shù)據(jù)挖掘應(yīng)知應(yīng)會(huì)的十大終端命令
- python使用dabl幾行代碼實(shí)現(xiàn)數(shù)據(jù)處理分析及ML自動(dòng)化
- python優(yōu)化數(shù)據(jù)預(yù)處理方法Pandas pipe詳解
- 推薦一款高效的python數(shù)據(jù)框處理工具Sidetable
- python數(shù)據(jù)分析近年比特幣價(jià)格漲幅趨勢(shì)分布
相關(guān)文章
使用OpenCV circle函數(shù)圖像上畫圓的示例代碼
這篇文章主要介紹了使用OpenCV circle函數(shù)圖像上畫圓的示例代碼,本文內(nèi)容簡(jiǎn)短,給大家突出重點(diǎn)內(nèi)容,需要的朋友可以參考下2019-12-12python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5不規(guī)則窗口實(shí)現(xiàn)與顯示GIF動(dòng)畫的詳細(xì)方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5不規(guī)則窗口與顯示GIF動(dòng)畫的詳細(xì)方法與實(shí)例,需要的朋友可以參考下2020-03-03使用darknet框架的imagenet數(shù)據(jù)分類預(yù)訓(xùn)練操作
這篇文章主要介紹了使用darknet框架的imagenet數(shù)據(jù)分類預(yù)訓(xùn)練操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07python 輸入一個(gè)數(shù)n,求n個(gè)數(shù)求乘或求和的實(shí)例
今天小編就為大家分享一篇python 輸入一個(gè)數(shù)n,求n個(gè)數(shù)求乘或求和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11python練習(xí)之曾經(jīng)很火的小人畫愛(ài)心表白代碼
小編有個(gè)好兄弟最近在追妹子,跟妹子打得火熱!就差臨門一腳了,這一jio我?guī)兔ρa(bǔ)上去了!他問(wèn)有沒(méi)有什么酷炫的表白方式,可以給人心動(dòng)的趕jio,表白的方式有許多種今天小編來(lái)教大家一個(gè)之前很火的小人畫愛(ài)心表白代碼2021-09-09Django跨域請(qǐng)求無(wú)法傳遞Cookie的解決
這篇文章主要介紹了Django跨域請(qǐng)求無(wú)法傳遞Cookie的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04