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