Python到底要這個self幹啥?

如果你寫過Python,如果你用Python寫Class,再加上你是個newbie,你一定和我一樣問過這個問題,這個self到底要幹麼,為什麼我寫每個class裡面的function第一個參數都是Self,Self 是Python的關鍵字嗎,而且好像Self拼成slef,他也不會出錯啊,這到底是啥啊?

當你認真的查一下,這個Self是幹啥的,通常會得到一個答案, 在PEP 20裡面的經典句子

Explicit is better than implicit.

要幹麼講清楚,不要以為我知道

但這答案…我還是不懂啊,可以講白話的嗎?

原來這個self是否需要存在,在Thinking in Java的作者Bruse Eckel和Python的作者Guido已經討論過了。

Guido認為留著這個Self是有優點的,優點有兩個:

一個是能夠加強語言的彈性,什麼意思?看一下下面的表示式

1
foo.meth(arg) == C.meth(foo, arg)

上面這個Expression,代表我們可以透過兩種方式來得到一樣的效果

1
object.function(arg) == class.function(object,arg)

這樣是好是壞,我也沒有一個太清楚的答案。

另一個優點是,我可以動態的把一個function 插進Class裡面,怎麼…有點低級,但是這個某程度來說增加了Python的語言彈性。看一下下面這段Code:

1
2
3
4
5
6
7
8
9
10
11
class C:
pass

def meth(myself, arg):
myself.val = arg
return myself.val

C.meth = meth

instanceC = C()
print instanceC.meth(123)

最後的結果是會印出123的,這樣當我們import進某個class,我們需要在他這個Class本身加一些function的時候,就可以動態放入我們需要的Function,至於有沒有非要這樣做的例子,好像是沒有。

看起來Guido也沒有要把Self改成保留字的意思,總的來說,他還是有他的堅持。

如果對Python self有什麼新的領悟,我會隨時補上的!