python裡面的self,是誰啊?

2021-10-01 21:38:53 字數 2851 閱讀 3262

對,你沒看錯,這是我初學python時的靈魂發問。

我們總會在class裡面看見self,但是感覺他好像也沒什麼用處,就是放在那裡占個位子。

如果你也有同樣的疑問,那麼恭喜你,你的class沒學明白。

所以,在解釋self是誰之前,我們先明確幾個問題:

什麼是class,什麼是instance,什麼是object?

什麼是method,什麼是function?

乙個畫外音,我個人是比較反對在程式設計教學中,對本來是英文的專有名詞進行中文翻譯的。正所謂語言塑造了思維,因此一些專有名詞一旦翻譯過來,無論你翻譯的多好,總會有一定程度的語意模糊。比如說「class」,我們在看到這個詞的瞬間會聯想到「課」,但是翻譯過來就是「類」,於是我們會不自覺地,去按照「課」或者「一大類」去理解這個專有名詞。這是一種非常嚴重的潛在的誤導,因為class這個專有名詞和「課」或者「一大類」關係都不太大_(:з」∠)_。所以還不如不翻譯,就當不知道這個詞啥意思,在學習的過程中再慢慢理解他代表的意思。

其實因為英文的侷限性,很多程式語言裡的專屬名詞也是大佬們一拍腦袋,瞎起的。。比如我吐槽了無數次的matplotlib裡面的axes。。。

又說多了。。。回到正題。

class buildrobot():

def __init__(self,armcount,headcount):

self.armcount = armcount

self.headcount = headcount

所以這裡的class,就是搭了乙個工廠叫buildrobot。'__init__' 就是告訴這個流水線,首先你需要這個機械人有幾個胳膊(『armcount』),有幾個腦袋(『headcount』)。先忽略一下這裡的self,以後講。

這個時候你可以run一下,這樣你的class就搭好了。可是這時的工廠,因為你沒有開始生產,是沒有任何產出的。下面就是instance

normal_robot = buildrobot(2,1)
檢視一下胳膊數對不對?

normal_robot.armcount
2
我們再來乙個 不太正常的機械人:

weird_robot = buildrobot(4,1)
normal_robot 和weird_robot 都是instance。他們雖然胳膊數量不一樣,但是本質上都是由這個class造出來的,由胳膊和頭組成的機械人。

上面這兩個說法是等價的。

兩者都由def定義,稍微粗糙一點的理解就是,在class裡面的function叫method。所以,method是和class,instance有關的一種function。

舉個栗子:

還是上面的工廠,我們現在加裝乙個車間,負責把胳膊上色:

class buildrobot():

def __init__(self,armcount,headcount):

self.armcount = armcount

self.headcount = headcount

def paintarm(self,color):

print("paint arm:",color)

這個paintarm,就是乙個method。還是一樣,現在這個class沒有生產,因此這個method也沒有任何實際的產品出來。我們只能先生產出乙個instance來:

colorful_robot = buildrobot(2,1)
好的我們現在有乙個兩個胳膊乙個頭的robot了。這時,我們的robot還是沒有上色的,因為我們沒有讓這個instance進入上色的那個車間。現在我們讓這個robot進入車間,塗個紅色。

colorful_robot.paintarm('red')
paint arm: red
上面的過程,就是call這個paintarm method。幾個點:

假如我把上色這個活,外包了。我就在外面另建了個工廠,專門上色,這就是function:

def outsourcing_paint(robot,color):

print("paint",robot,"arm:",color)

outsourcing_paint(colorful_robot,'red')

paint <__main__.buildrobot object at 0x116b434a8> arm: red
這個外包的上色工廠,不管你這個東西是從哪個工廠來的,無論你是個機械人還是機器狗,反正我就拿來,給胳膊上色。

看到這裡,應該就明白function和method的區別了。

注意method其實有兩種,一種是instance method,一種是class method。

本篇的討論,我們先限定在instance method裡。

把class, method講明白以後,終於能講self了。通過上面的例子,我們注意到

outsourcing_paint(colorful_robot,'red')

colorful_robot.paintarm('red')

總結:self是在為class編寫instance method的時候,放在變數名第乙個位子的佔位詞。

在具體編寫instance method裡,可以不使用self這個變數。

如果在method裡面要改變instance的屬性,可以用self.***x來指代這個屬性進行修改。

所以self, 就是指由這個class造出來的instance嘛。

python裡面的self代表類的假設例項物件

對,你沒看錯,這是我初學python時的靈魂發問。我們總會在class裡面看見self,但是感覺他好像也沒什麼用處,就是放在那裡占個位子。如果你也有同樣的疑問,那麼恭喜你,你的class沒學明白。所以,在解釋self是誰之前,我們先明確幾個問題 什麼是class,什麼是instance,什麼是obj...

Python裡面的字典

python 將這種資料型別叫做 dict 有的語言裡它的名稱是 hash 這兩種名字都會用到,不過這並不重要,重要的是它們和列表的區別。你看,針對列表你可以做這樣的事情 things a b c d print things 1 b things 1 z print things 1 z prin...

python裡面的數學

一.基本運算子 1.算數運算 2.比較運算 特殊情況 不等於 新版本不支援 不等號 3.賦值運算 4.邏輯運算 not 非 非真即假,非假即真.and 並且 左右兩端同時為真,結果才為真.or 或者 左右兩端有乙個為真,結果就是真.true 真 1 判斷的結果 false 假 0 判斷的結果 pri...