关于Python中的self
雖然我現在寫過一些Python代碼,但實際上幾乎還沒用過Class,而且一直覺得一個很別扭的事情是,Class中的函數都要寫個參數self,雖然實例化調用的時候不需要。
當然,一開始就知道Python這樣設計應該有它的理由,具體是什么也沒去考慮。
今天看到一個這樣的說法:
源地址:http://www.douban.com/group/topic/19376685/
我解釋一下python的類方法為什么要寫一個self參數
來自:?巴特富萊韋杭普(Butterfly Wet-hamp)?2011-04-26 23:18:19
這是對前面一個php程序員問python方法為什么要手寫一個self的回答,當時那個帖非常的熱鬧,但是下面沒有一個回復講到要點,等我有空,已經找不到原帖了。?
原因有多重。首先是python中幾乎所有的東西的一級對象(一級對象的定義:http://en.wikipedia.org/wiki/First-class_object),method也不例外,比如你寫一個:?
class X:?
def f(self, a, b):?
...?
那么可以這樣引用f:?
X.__dict__['f']?
或者?
X.f.__func__?
現在問題來了,得到f以后怎么調用?f是一個方法,方法必須作用于對象。如果x是一個X對象,我們可以x.f(...),但是如果是以上面的方式得到的f呢?怎么f讓作用于某個對象?最直觀的方法就是和參數一起傳遞進去。?
當然的限不同的設計也可以滿足上面制。比如不要手寫的self參數,增加this關鍵字,增加一個調用f個格式。這樣的設計和pep20第二條不符合。?
為理解python的self,不妨對比一下ruby和javascript。ruby的方式是方法不是一級對象,所以繞過了這個問題。javascript沒有類,方法在調用時this會綁定到方法所屬的對象,函數調用時this綁定到window,函數做構造器調用時this綁定到新對象。這么多規則,比Python復雜。?
?雖然基本上算是理解了Python為什么要加這個self。但是!!!我必須想明白這個但是!!!我之所以喜歡Python,就是因為它的簡潔,我之前的理解是:
用最少的工作做最多的事情
繁瑣的工作沒必要做
出來的結果跟想象的結果驚人的一致
正因為這樣,所以,我實在是無法理解這個self,無論從哪方面考慮,它都是多余的,既然連{}這種東西都能省,為什么一個self不能省?!縱使PEP 20哲學說清晰好過模糊,但為什么還支持帶缺省值的參數,為什么不像C語言那樣不能省略?
所以,無論是從Python設計哲學還是設計技術細節來考慮,這個self真的是一個很奇怪的東西,再怎么說,前面已經有個class了,這一段就是類啊!!!
轉載于:https://www.cnblogs.com/fwindpeak/p/3341787.html
總結
以上是生活随笔為你收集整理的关于Python中的self的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQ核心骨架
- 下一篇: (转)如何用U盘创建Linux系统盘
狼.敬畏生命?(wolf python london)?2011-04-27 08:38:50
說下我的理解:?
我在學習python的時候,也發現一直寫著self很別扭,在c++中,this指針是隱式的,除非不得以的時候,,比如傳進來的參數和類的成員變量的名字相同,或者要返回當前對象。 而python的self是顯示的。而且this指針基本上不用在函數頭里面。?
python是動態語言,設計出來的類和靜態語言的格式不同,首先c++在類的定義(聲明)時,會指定類的成員變量,比如在private:里。但是Python不行,它沒法顯式的說 哪個屬性是自己的,而且屬性還可以動態的增加,此時,一個解決方案出來了,增加self,通過self.訪問的就可以做為類的屬性。至于類的方法為什么要顯式的寫上self(我感覺,完全可以由解釋器隱式添加上去),估計就是python的哲學導致的:Explicit is better than implicit.?
zizi?(努力賺錢中)?2011-04-27 09:20:05
個人理解:?
除了前兩種形式外還有第三種形式X.f,這個返回的和前兩個不同。?
其實你寫不寫self或者其他什么對于python來說都無所謂,對于python來說,方法就分兩種一種是綁定的,一種是不綁定。對于綁定的方法來說,python就會把他綁定的對象作為第一個參數傳給這個對象。self僅僅是提醒你這個方法會被綁定到實例上而已。?
同時這樣做還有個好處就是兼容python的C/API部分。Python本身是用C寫成的,在C中實現類似面向機制都是這么寫的:?
SSL_connect(SSL *ssl, ARG *arg1)?
再看看Python C API的OO部分?
int PyObject_Print(PyObject *o, FILE *fp, int flags)?
所以我大膽猜測self的機制是從C繼承而來的。
zizi?(努力賺錢中)?2011-04-27 09:26:38
PS:對于你說ruby中方法不是第一級對象這個事情能否解釋一下??
我RUBY用的不多,但是我印象中ruby的方法應該能滿足first class的定義。
李保銀?2011-04-27 10:21:11
self是類方法的一個位置參數,它就是類的實例對象自己,當實例調用方法時:?
instance = X()?
instance.f('a', 'b')?
等同于:?
X.f(instance, 'a', 'b')?
第一個參數是實例自己。
bachue?2013-05-16 15:58:28
"當然的限不同的設計也可以滿足上面制。比如不要手寫的self參數,增加this關鍵字,增加一個調用f個格式。這樣的設計和pep20第二條不符合。"?
不能茍同 如果真的是“Explicit is better than implicit.”,為何x.f()中的x是以implicit的方法送進f的?為何不寫成f(x)?為何Python不去除面向對象以完全實現“Explicit is better than implicit.”?
alinwawa?2013-09-08 05:25:57
狼.敬畏生命,寫得最好。確實python犧牲了隱式的簡潔,但是換來了極大的靈活性,比如隨意添加對象屬性。這個比c++方便太多倍了。
蘇打?2013-09-08 08:59:36
說下我的理解: 我在學習python的時候,也發現一直寫著self很別扭,在c++中,this指針是隱式?...?狼.敬畏生命靠IDE能否省掉這些重復?
精密空調?2013-09-11 12:01:24
習慣上,方法的第一個參數命名為 self。這僅僅是一個約定:對Python而言,self 絕對沒有任何特殊含義。(然而要注意的是,如果不遵守這個約定,別的Python程序員閱讀你的代碼時會有不便,而且有些類瀏覽程序也是遵循此約定開發的。)