日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关于Python中的self

發布時間:2025/5/22 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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復雜。?

11人?喜歡?喜歡 回應?推薦?喜歡只看樓主
  • 狼.敬畏生命?(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程序員閱讀你的代碼時會有不便,而且有些類瀏覽程序也是遵循此約定開發的。)

?雖然基本上算是理解了Python為什么要加這個self。但是!!!我必須想明白這個但是!!!我之所以喜歡Python,就是因為它的簡潔,我之前的理解是:

用最少的工作做最多的事情

繁瑣的工作沒必要做

出來的結果跟想象的結果驚人的一致

正因為這樣,所以,我實在是無法理解這個self,無論從哪方面考慮,它都是多余的,既然連{}這種東西都能省,為什么一個self不能省?!縱使PEP 20哲學說清晰好過模糊,但為什么還支持帶缺省值的參數,為什么不像C語言那樣不能省略?

所以,無論是從Python設計哲學還是設計技術細節來考慮,這個self真的是一個很奇怪的東西,再怎么說,前面已經有個class了,這一段就是類啊!!!

轉載于:https://www.cnblogs.com/fwindpeak/p/3341787.html

總結

以上是生活随笔為你收集整理的关于Python中的self的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。