posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

          Posted on 2008-11-15 19:58 ZelluX 閱讀(2537) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): OOP

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

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

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

          第二個(gè)原因在于通過(guò)self參數(shù)我們可以動(dòng)態(tài)修改一個(gè)類(lèi)的行為:

          # ?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

          這樣類(lèi)C就新增了一個(gè)meth方法,并且所有C的實(shí)例都可以通過(guò)c.meth(newval)調(diào)用這個(gè)方法。

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

          根據(jù)修飾對(duì)象,decorator分兩種,類(lèi)方法和靜態(tài)方法。兩者在語(yǔ)法上沒(méi)有什么區(qū)別,但前者需要self參數(shù),后者不需要。而Python在實(shí) 現(xiàn)上也沒(méi)有對(duì)這兩種方法加以區(qū)分。Bruce日志評(píng)論中有一些試圖解決decorator問(wèn)題的方法,但這些方法都需要修改大量底層的實(shí)現(xiàn)。

          最后提到了另一種語(yǔ)法糖實(shí)現(xiàn),新增一個(gè)名為classmethod的decorator,為每個(gè)方法加上一個(gè)self參數(shù),當(dāng)然這種實(shí)現(xiàn)也沒(méi)必要把self作為關(guān)鍵字使用了。不過(guò)我覺(jué)得這么做還不如每次寫(xiě)類(lèi)方法時(shí)手工加個(gè)self =_=



          評(píng)論

          # re: 為什么Python中的self必須保留?  回復(fù)  更多評(píng)論   

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

          # re: 為什么Python中的self必須保留?  回復(fù)  更多評(píng)論   

          2008-11-16 13:06 by ZelluX
          @王軼凡
          哇,yifanw大牛@@
          主站蜘蛛池模板: 车致| 皋兰县| 怀安县| 宜兴市| 海兴县| 安图县| 阜阳市| 台前县| 淮阳县| 丰镇市| 米泉市| 桂东县| 嘉善县| 昆明市| 宜城市| 神木县| 崇义县| 墨脱县| 瑞安市| 湟中县| 万荣县| 加查县| 长兴县| 麻城市| 伊宁县| 乌拉特后旗| 天祝| 繁峙县| 葫芦岛市| 平塘县| 雅安市| 庆城县| 金塔县| 芒康县| 华宁县| 西峡县| 乾安县| 黔西县| 重庆市| 海丰县| 磐石市|