如果你寫過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 | class C: |
最後的結果是會印出123的,這樣當我們import進某個class,我們需要在他這個Class本身加一些function的時候,就可以動態放入我們需要的Function,至於有沒有非要這樣做的例子,好像是沒有。
看起來Guido也沒有要把Self改成保留字的意思,總的來說,他還是有他的堅持。
如果對Python self有什麼新的領悟,我會隨時補上的!