posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          日歷

          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          相冊

          搜索

          •  

          積分與排名

          • 積分 - 337506
          • 排名 - 167

          最新評論

          為什么Python中的self必須保留?

          Posted on 2008-11-15 19:58 ZelluX 閱讀(2540) 評論(2)  編輯  收藏 所屬分類: OOP

          Bruce Eckel的一篇日志建議把self從方法的參數列表中移除,并把它作為一個關鍵字使用。
          http://www.artima.com/weblogs/viewpost.jsp?thread=239003

          Guido的這篇日志說明了self作為參數是必不可少的。
          http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

          第一個原因是保證foo.meth(arg)和C.meth(foo, arg)這兩種方法調用的等價(foo是C的一個實例),關于后者可以參見Python Reference Manual 3.4.2.3。這個原因理論上的意義比較大。

          第二個原因在于通過self參數我們可以動態修改一個類的行為:

          # ?Define?an?empty?class:
          class ?C:
          pass
          ?
          # ?Define?a?global?function:
          def ?meth(myself,?arg):
          myself.val?
          = ?arg
          return ?myself.val
          ?
          # ?Poke?the?method?into?the?class:
          C.meth? = ?meth

          這樣類C就新增了一個meth方法,并且所有C的實例都可以通過c.meth(newval)調用這個方法。

          前面兩個原因或許都可以通過一些workaround使得不使用self參數時實現同樣的效果,但是在存在decorator的代碼中Bruce的方法存在致命的缺陷。(關于decorator的介紹可以參見http://www.python.org/dev/peps/pep-0318/)

          根據修飾對象,decorator分兩種,類方法和靜態方法。兩者在語法上沒有什么區別,但前者需要self參數,后者不需要。而Python在實 現上也沒有對這兩種方法加以區分。Bruce日志評論中有一些試圖解決decorator問題的方法,但這些方法都需要修改大量底層的實現。

          最后提到了另一種語法糖實現,新增一個名為classmethod的decorator,為每個方法加上一個self參數,當然這種實現也沒必要把self作為關鍵字使用了。不過我覺得這么做還不如每次寫類方法時手工加個self =_=



          評論

          # re: 為什么Python中的self必須保留?  回復  更多評論   

          2008-11-16 10:36 by 王軼凡
          贊一個,雖然是翻譯,不是原創 :)

          # re: 為什么Python中的self必須保留?  回復  更多評論   

          2008-11-16 13:06 by ZelluX
          @王軼凡
          哇,yifanw大牛@@
          51La
          主站蜘蛛池模板: 拉孜县| 富顺县| 定州市| 托克逊县| 陇西县| 清涧县| 集安市| 丽水市| 巢湖市| 新龙县| 繁峙县| 孟州市| 芜湖市| 福安市| 乌拉特后旗| 重庆市| 陕西省| 岑巩县| 澄迈县| 赤壁市| 黑山县| 子长县| 威海市| 鹤岗市| 峨眉山市| 治县。| 三门县| 凌云县| 怀远县| 城口县| 阿拉尔市| 星子县| 岳普湖县| 图们市| 开远市| 山丹县| 英超| 新民市| 西乡县| 且末县| 福贡县|