" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python為什么要保留顯式的self

 更新時間:2022年06月28日 10:10:07   作者:編程學(xué)習(xí)網(wǎng)  
本文主要介紹了Python為什么要保留顯式的self,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Bruce 的提議

Bruce 知道,我們需要一種方法來區(qū)分對實例變量的引用和對其它變量的引用,因此他建議將“self”設(shè)為關(guān)鍵字。
考慮一種典型的類,它有一個方法,例如:

class C:
   def meth(self, arg):
      self.val = arg
      return self.val

跟據(jù) Bruce 的提議,這將變?yōu)椋?/p>

class C:
   def meth(arg):# Look ma, no self!
      self.val = arg
      return self.val

這樣每個方法會節(jié)省 6 個字符。但我不覺得 Bruce 提出這個建議是為了減少打字。
我認為他真正關(guān)心的是程序員(可能來自其它語言)所浪費的時間,有時候似乎不需要指定“self”參數(shù),而且他們偶爾忘記了要加(即使他們十分清楚——習(xí)慣是一種強大的力量)。確實,與忘記在實例變量或方法引用之前鍵入“self.”相比,從參數(shù)列表中省略“self”,往往會導(dǎo)致很模糊的錯誤消息。

也許更糟糕的是(如 Bruce 所述),當(dāng)正確地聲明了方法,但是在調(diào)用時的參數(shù)數(shù)量不對,這時收到的錯誤消息。如 Bruce 給出的以下示例:

Traceback (most recent call last):
File "classes.py", line 9, in
   obj.m2(1)
TypeError: m2() takes exactly 3 arguments (2 given)

我贊同它是令人困惑的,但是我寧愿去解決此錯誤消息,而不是修改語言。

為什么 Bruce 的提議不可行

首先,讓我提出一些與 Bruce 的提議相反的典型論點。
這有一個很好的論據(jù)可以證明,在參數(shù)列表中使用顯式的“self”,可以增強以下兩種調(diào)用方法在理論上的等效性。假設(shè)“ foo”是“C”的一個實例:

foo.meth(arg) == C.meth(foo, arg)

(譯注:說實話,我沒有理解這個例子的意思。以下僅是個人看法。在類的內(nèi)部定義方法時,可能會產(chǎn)生幾種不同的方法:實例方法、類方法和 靜態(tài)方法。它們的作用和行為是不同的,那么在定義和調(diào)用時怎么做區(qū)分呢?Python 約定了一種方式,即在定義時用第一個參數(shù)作區(qū)分:self 表示實例方法、cls或其它符號 表示類方法……三種方法都可以被類的實例調(diào)用,而且看起來一模一樣,如上例的等號左側(cè)那樣。這時候就要靠定義時賦予的參數(shù)來區(qū)分了,像上例等號右側(cè),第一個參數(shù)是實例對象,表明此處是個實例方法。)

另一個論據(jù)是,在參數(shù)列表中使用顯式的“self”,將一個函數(shù)插入一個類,獲得動態(tài)地修改一個類的能力,創(chuàng)建出相應(yīng)的一個類方法。

例如,我們可以創(chuàng)建一個與上面的“C”完全等效的類,如下所示:

# 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

請注意,我將“self”參數(shù)重命名為“myself”,以強調(diào)(在語法上)我們不是在此處定義一個方法(譯注:類外部的是函數(shù),即 function,類內(nèi)部的是方法,即 method)。

這樣之后,C 的實例就具有了一個“meth”方法,該方法有一個參數(shù),且功能跟之前的完全一樣。對于在把方法插入類之前就創(chuàng)建的那些 C 的實例,它甚至也適用。

我想 Bruce 并不特別在意前述的等效性。我同意這只是理論上的重要。我能想到的唯一例外是舊式的調(diào)用超級方法的習(xí)語(idiom)。但是,這個習(xí)語很容易出錯(正是由于需要顯式地傳遞"self"的原因),這就是為什么在 Python 3000中,我建議在所有情況下都使用"super()"的原因。

Bruce 可能會想到一種使第二個等效例子起作用的方法——在某些情況下,這種等效性真的很重要。我不知道 Bruce 花了多少時間思考如何實現(xiàn)他的提議,但是我想他正在考慮將一個名為“self”的額外形參自動地添加到直接地在類內(nèi)部定義的所有方法的思路(我必須說是“直接地”,以便那些嵌套在方法內(nèi)部的函數(shù),能免于這種自動操作)。這樣,可以使第一個等效例子保持等效。

但是,有一種情況我認為 Bruce 不能在不向編譯器中添加某種 ESP 的情況下解決:裝飾器。我相信這是 Bruce 的提議的最終敗筆。

當(dāng)裝飾一個方法時,我們不知道是否要自動地給它加一個“self”參數(shù):裝飾器可以將函數(shù)變成一個靜態(tài)方法(沒有“self”)或一個類方法(有一個有趣的 self,它指向一個類而不是一個實例),或者可以做一些完全不同的事情(用純 Python 實現(xiàn)“ @classmethod”或“ @staticmethod”的裝飾器是繁瑣的)。除非知道裝飾器的用途,否則沒有其它辦法來確定是否要賦予正在定義的方法一個隱式的“self”參數(shù)。

我拒絕諸如特殊包裝的“@classmethod”和“@staticmethod”之類的黑科技。我也認為除了自檢外,自動地確定某個方法是類方法(class method)、實例方法(instance method)還是靜態(tài)方法(static method),這不是一個好主意(就像在 Bruce 的文章的評論中,有人建議的那樣):這使得很難僅僅根據(jù)方法前的“def”,來決定應(yīng)該怎樣調(diào)用該方法。

(譯注:對于一個方法,在當(dāng)前的添加了相應(yīng)參數(shù)的情況下,可以簡單地加裝飾器,區(qū)分它是哪種方法,調(diào)用時也容易區(qū)分調(diào)用;但是,如果沒有加參數(shù),即使可以用神奇的自動機制來區(qū)分出它是哪種方法,但在調(diào)用時,你不好確定該怎么調(diào)用)。

在評論中,我看到了一些非常極端的對 Bruce 的提議的附和,但通常的代價是使得規(guī)則難以遵循,或者要求對語言進行更深層的修改,這令我們極其難以接受它,特別是合入 Python 3.1。順便說一句,對于 3.1,再次聲明我們的規(guī)則,新特性只有在保持向后兼容的情況下才是可接受的。

有一個似乎可行的建議(可以使它向后兼容)是把類中的

def foo(self, arg): ...

改成這樣的語法糖:

def self.foo(arg): ...

但我不認同它把“self”變?yōu)楸A糇郑╮eserved word),或者要求前綴必須是“self”。如果這樣做了,那對于類方法,很容易也出現(xiàn)這種情況:

@classmethod
def cls.foo(arg): ...

好了,相比于現(xiàn)狀,我并沒有更喜歡這個。但是相比于 Bruce 的提議或在他的博客評論區(qū)中提出的更極端的說法,我認為這個要好得多,而且它具有向后兼容的巨大優(yōu)勢,并且不需要很費力,就可以寫成帶有參考實現(xiàn)的 PEP。(我想 Bruce 應(yīng)該會發(fā)現(xiàn)自己提案中的缺陷,如果他真的付出努力嘗試編寫可靠的 PEP 或者嘗試實現(xiàn)它。)

到此這篇關(guān)于Python為什么要保留顯式的self的文章就介紹到這了,更多相關(guān)Python保留顯式self內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何使用Python發(fā)送HTML格式的郵件

    如何使用Python發(fā)送HTML格式的郵件

    這篇文章主要介紹了如何使用Python發(fā)送HTML格式的郵件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • python如何實現(xiàn)API的調(diào)用詳解

    python如何實現(xiàn)API的調(diào)用詳解

    Web?API是網(wǎng)站的一部分,用于與使用非常具體的URL請求特定信息的程序交互,下面這篇文章主要給大家介紹了關(guān)于python實現(xiàn)API的快速調(diào)用指南,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • 解決Pycharm輸入法無法切換中英文問題

    解決Pycharm輸入法無法切換中英文問題

    這篇文章主要介紹了解決Pycharm輸入法無法切換中英文問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • python實現(xiàn)八大排序算法(2)

    python實現(xiàn)八大排序算法(2)

    這篇文章主要為大家詳細介紹了python實現(xiàn)八大排序算法的第二篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Python自動操作神器PyAutoGUI的使用教程

    Python自動操作神器PyAutoGUI的使用教程

    這篇文章主要是想和大家來聊一聊Python如何利用自動操作 GUI 神器——PyAutoGUI在桌面實現(xiàn)自動化操作,感興趣的小伙伴可以了解一下
    2022-06-06
  • python mysql斷開重連的實現(xiàn)方法

    python mysql斷開重連的實現(xiàn)方法

    這篇文章主要介紹了python mysql斷開重連的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python從文件中讀取數(shù)據(jù)的方法步驟

    Python從文件中讀取數(shù)據(jù)的方法步驟

    這篇文章主要介紹了Python從文件中讀取數(shù)據(jù)的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python進階從青銅到王者一定會用上的Python技巧

    python進階從青銅到王者一定會用上的Python技巧

    這篇文章主要介紹了python進階從青銅到王者一定會用上的Python技巧,本文通過幾個Python的小案例,讓大家體會其中蘊含的技巧一起來圍觀吧
    2021-09-09
  • 17條提高工作效率的Python技巧分享

    17條提高工作效率的Python技巧分享

    這篇文章主要介紹了17條提高工作效率的Python技巧分享,掌握這些Python技巧可以讓我們的生活更加輕松,本文就日常中經(jīng)常使用到的Python技巧進行歸納總結(jié),對于常用的17條技巧均給出了完整的代碼示例和具體講解,需要的朋友可以參考下
    2022-01-01
  • Django框架模型簡單介紹與使用分析

    Django框架模型簡單介紹與使用分析

    這篇文章主要介紹了Django框架模型簡單介紹與使用,結(jié)合實例形式分析了Django框架中模型的概念、原理、使用技巧與相關(guān)操作注意事項,需要的朋友可以參考下
    2019-07-07

最新評論

盱眙县| 丰顺县| 杨浦区| 定结县| 临猗县| 蒲城县| 永丰县| 宜黄县| 莱阳市| 新沂市| 太仆寺旗| 武宣县| 壤塘县| 团风县| 遂昌县| 盱眙县| 邢台市| 永胜县| 平潭县| 城市| 抚顺市| 马关县| 孝感市| 沿河| 葫芦岛市| 突泉县| 斗六市| 竹山县| 久治县| 开化县| 格尔木市| 青岛市| 盐津县| 陵水| 祁阳县| 武安市| 托克逊县| 章丘市| 綦江县| 安新县| 老河口市|