<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        python參數列表中的self顯式不等于冗余

        來源:懂視網 責編:小采 時間:2020-11-27 14:39:14
        文檔

        python參數列表中的self顯式不等于冗余

        python參數列表中的self顯式不等于冗余:self在區分全局變量/函數和對象中的成員變量/函數十分有用。例如,它提供了一種作用域機制,我個人認為比Ruby的@和@@清晰多了,這可能是習慣使然吧,但它確實和C++、Java中的this很相似。 然而,self總是有令我困擾的地方,我以前在這里說過—我曾幻想能在P
        推薦度:
        導讀python參數列表中的self顯式不等于冗余:self在區分全局變量/函數和對象中的成員變量/函數十分有用。例如,它提供了一種作用域機制,我個人認為比Ruby的@和@@清晰多了,這可能是習慣使然吧,但它確實和C++、Java中的this很相似。 然而,self總是有令我困擾的地方,我以前在這里說過—我曾幻想能在P

        self在區分全局變量/函數和對象中的成員變量/函數十分有用。例如,它提供了一種作用域機制,我個人認為比Ruby的@和@@清晰多了,這可能是習慣使然吧,但它確實和C++、Java中的this很相似。
        然而,self總是有令我困擾的地方,我以前在這里說過—我曾幻想能在Python3中這些能得以改進,然后通常會引發一輪熱議并最終以人們所說的“顯勝于隱”告終。
        我在巴西的時候曾和Luciano Ramalho(巴西Python組織的主席)有過一次交談。他讓我明白并非無處不在的self讓我困擾不已,而是參數列表中的self,我想也稱為非pythonic(un-pythonic)。
        它是如何使用的
        下面是一些簡單的Python代碼,說明了如何使用類。

        代碼如下:


        def f(): pass
        a = 1
        class C1(object):
        a = 2
        def m1(self):
        print a # Prints '1'
        print self.a # Prints '2'
        f() # The global version
        self.m2() # Must scope other members
        def m2(self): pass
        obj = C1()
        obj.m1()


        首先看f()和a,它們都可在全局作用域中調用。類C1被定義成繼承自object,這是定義一個新類的標準過程(我想在Python3中這些會變得更加不明顯)。
        注意,m1()和m2()的第一個參數都是self。在Python中,self不是關鍵字。但按照慣例“self”代表當前對象的地址,也就是對象的地址通常是第一個參數。
        在類范圍上定義a是創建對象作用域的方式之一。你也可以在a的method里賦值給self.a,并且第一次運行該語句時就分配了這個域的內存空間。但有必要區分兩種版本的a。若在method內部使用a,那么這個a就是全局版本的,而self.a體現的是對象域(你也可以在類內部對全局變量進行賦值,這里我暫不考慮這種情況)。
        同樣地,一個對f()的非限定調用(unqualified call)造就了全局函數,通過對其限定self.m2()調用的是成員函數(同時將當前對象地址作為傳遞給m2()的self變量)。
        現在來看一個含有帶參數的method的類:

        代碼如下:


        class C2(object):
        def m2(self, a, b): pass


        為了調用該method,我們創建了一個對象實例,然后使用點表達式調用對象obj上的m2():

        代碼如下:


        obj = C2()
        obj.m2(1,2)


        在調用過程中,obj的地址作為self變量在m2()中隱含傳遞,這里遇到了一個嚴重的矛盾:為何當定義method時隱式好于顯式,而調用method時隱式也毫無問題?
        當然我想這可能是method調用語法所要求的,但這就意味著method的定義和調用有很大不同,這里既沒有“顯式”也不pythonic。在調用參數個數錯誤的method時就能看出來:
        obj.m2(1)
        結果錯誤提示為:
        Traceback (most recent call last):
        File "classes.py", line 9, in
        obj.m2(1)
        TypeError: m2() takes exactly 3 arguments (2 given)
        由于method調用期間self的隱式參數傳遞,上述錯誤信息實際是說應該這樣調用method:
        C2.m2(obj,1,2)
        即使上面這行語句運行成功,它當然也不是實際的調用方式。你應該使用常規的method調用語法,即傳遞兩個參數:
        obj.m2(1,2)
        錯誤信息“m2() takes exactly 3 arguments (2 given)”不僅讓初學者十分糊涂,我每次看到它后也常常懵住。我想這既表明了它是非Pythonic、也直指method定義和調用的矛盾。
        絕望的建議
        盡管漫長歷史中盡是絕望,我又有哪些建議呢?
        在Python3.1中增加self為關鍵字(有一點更加向后不兼容)(或直接使用this來使C++和Java程序員時更容易過渡)。而所有與self有關的已有規則都不變。
        唯一的改變是:你不必將self放入method參數列表中。這是唯一隱式的地方,其它都是顯式的—除了依舊不變的method調用。
        它實現了method定義和調用的一致性。你可以定義一個與調用時具有相同參數個數的method。當調用method所傳遞參數個數出錯時,錯誤信息會通知method應含有的實際參數個數,而不是多出一個。
        顯式 vs.冗余
        在我再一次聽到“顯勝于隱”之前,讓某件事變得清晰和變得冗余還是有區別的。我們已有這樣一種語言:它讓你歷經了無數考驗,原因就是起初看起來似乎很好但之后問題卻越來越多。它叫做Java。
        如果想讓每一件東西都變為顯式,我們可以使用C或匯編以及其它能夠精確說明和展現機器內部運行細節的語言。
        強制程序員將self放入method參數列表與顯式根本不沾邊,它只是強制造成冗余的做法,也不會增加編程的表達方式(已經知道是一個method了,何必還要在參數列表中加入self來提醒我們呢)。我認為,它是死板的,也是非pythonic。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        python參數列表中的self顯式不等于冗余

        python參數列表中的self顯式不等于冗余:self在區分全局變量/函數和對象中的成員變量/函數十分有用。例如,它提供了一種作用域機制,我個人認為比Ruby的@和@@清晰多了,這可能是習慣使然吧,但它確實和C++、Java中的this很相似。 然而,self總是有令我困擾的地方,我以前在這里說過—我曾幻想能在P
        推薦度:
        標簽: se python pytho
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久久高清免费视频| 久久精品国产免费一区| 大地资源二在线观看免费高清 | 国产乱子影视频上线免费观看| 亚洲国产成人久久综合一区| 久草视频免费在线| 久久精品国产99国产精品亚洲| 国产精品成人免费福利| 亚洲va在线va天堂成人| 四虎成人免费网址在线| 老司机福利在线免费观看| 亚洲人成国产精品无码| 国内精品一级毛片免费看| 久久精品亚洲精品国产色婷 | 中文在线观看国语高清免费| 亚洲精品成人网站在线观看 | 亚洲AV日韩精品久久久久久久| 久9久9精品免费观看| 亚洲欧洲春色校园另类小说| 成人免费午夜在线观看| 婷婷亚洲综合五月天小说在线| 国产91精品一区二区麻豆亚洲| 国产一级片免费看| 亚洲三级中文字幕| 四虎永久免费观看| 99久久国产精品免费一区二区 | 亚洲av区一区二区三| 中国人免费观看高清在线观看二区| 久久亚洲高清观看| 最近2018中文字幕免费视频| 亚洲人成网站日本片| 国产一级一片免费播放i| 三上悠亚在线观看免费| 亚洲一级毛片免费看| 免费欧洲毛片A级视频无风险| 国产97视频人人做人人爱免费| 久久夜色精品国产噜噜亚洲AV| 全免费a级毛片免费看无码| 国内精品免费久久影院| 亚洲人配人种jizz| 在线观看亚洲av每日更新|