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

python 參數(shù)列表中的self 顯式不等于冗余

 更新時間:2008年12月01日 18:44:43   作者:  
Self in the Argument List: Redundant is not Explicit
self在區(qū)分全局變量/函數(shù)和對象中的成員變量/函數(shù)十分有用。例如,它提供了一種作用域機制,我個人認為比Ruby的@和@@清晰多了,這可能是習慣使然吧,但它確實和C++、Java中的this很相似。
然而,self總是有令我困擾的地方,我以前在這里說過—我曾幻想能在Python3中這些能得以改進,然后通常會引發(fā)一輪熱議并最終以人們所說的“顯勝于隱”告終。
我在巴西的時候曾和Luciano Ramalho(巴西Python組織的主席)有過一次交談。他讓我明白并非無處不在的self讓我困擾不已,而是參數(shù)列表中的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,它們都可在全局作用域中調(diào)用。類C1被定義成繼承自object,這是定義一個新類的標準過程(我想在Python3中這些會變得更加不明顯)。
注意,m1()和m2()的第一個參數(shù)都是self。在Python中,self不是關(guān)鍵字。但按照慣例“self”代表當前對象的地址,也就是對象的地址通常是第一個參數(shù)。
在類范圍上定義a是創(chuàng)建對象作用域的方式之一。你也可以在a的method里賦值給self.a,并且第一次運行該語句時就分配了這個域的內(nèi)存空間。但有必要區(qū)分兩種版本的a。若在method內(nèi)部使用a,那么這個a就是全局版本的,而self.a體現(xiàn)的是對象域(你也可以在類內(nèi)部對全局變量進行賦值,這里我暫不考慮這種情況)。
同樣地,一個對f()的非限定調(diào)用(unqualified call)造就了全局函數(shù),通過對其限定self.m2()調(diào)用的是成員函數(shù)(同時將當前對象地址作為傳遞給m2()的self變量)。
現(xiàn)在來看一個含有帶參數(shù)的method的類:
復制代碼 代碼如下:

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

為了調(diào)用該method,我們創(chuàng)建了一個對象實例,然后使用點表達式調(diào)用對象obj上的m2():
復制代碼 代碼如下:

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

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

相關(guān)文章

  • Python代碼實現(xiàn)列表分組計數(shù)

    Python代碼實現(xiàn)列表分組計數(shù)

    這篇文章主要介紹了Python代碼實現(xiàn)列表分組計數(shù),利用Python代碼實現(xiàn)了使用分組函數(shù)對列表進行分組,并計算每組的元素個數(shù)的功能,需要的朋友可以參考一下
    2021-11-11
  • Python3實現(xiàn)的判斷環(huán)形鏈表算法示例

    Python3實現(xiàn)的判斷環(huán)形鏈表算法示例

    這篇文章主要介紹了Python3實現(xiàn)的判斷環(huán)形鏈表算法,涉及Python針對環(huán)形鏈表的遍歷、判斷相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • python可迭代對象去重實例

    python可迭代對象去重實例

    這篇文章主要介紹了python可迭代對象去重實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 一道python走迷宮算法題

    一道python走迷宮算法題

    這篇文章主要為大家詳細介紹了一道python走迷宮算法題,用一個二維數(shù)組表示一個簡單的迷宮,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • python基礎(chǔ)之遞歸函數(shù)

    python基礎(chǔ)之遞歸函數(shù)

    這篇文章主要介紹了python遞歸函數(shù),實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下
    2021-10-10
  • Python自動巡檢H3C交換機實現(xiàn)過程解析

    Python自動巡檢H3C交換機實現(xiàn)過程解析

    這篇文章主要介紹了Python自動巡檢H3C交換機實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Python HTMLTestRunner可視化報告實現(xiàn)過程解析

    Python HTMLTestRunner可視化報告實現(xiàn)過程解析

    這篇文章主要介紹了Python HTMLTestRunner可視化報告實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • python通過線程實現(xiàn)定時器timer的方法

    python通過線程實現(xiàn)定時器timer的方法

    這篇文章主要介紹了python通過線程實現(xiàn)定時器timer的方法,涉及Python線程與定時器timer的使用技巧,需要的朋友可以參考下
    2015-03-03
  • Django項目如何獲得SSL證書與配置HTTPS

    Django項目如何獲得SSL證書與配置HTTPS

    本文總結(jié)了如何獲得SSL證書并給Django項目配置HTTPS,建議先收藏再閱讀,將來有一天你很可能會用到它。
    2021-04-04
  • 一行Python代碼實現(xiàn)為圖片上版權(quán)

    一行Python代碼實現(xiàn)為圖片上版權(quán)

    不知道大家會不會遇到這樣的情況,自己辛辛苦苦整理的攻略,分享給自己的一些朋友,結(jié)果分享有人堂而皇之地拿著這份攻略圖片去引流,并聲稱是自己整理的,真是豈有此理!本文就來用Python實現(xiàn)為圖片上版權(quán),需要的可以參考一下
    2023-01-01

最新評論

同心县| 桂林市| 眉山市| 西藏| 邮箱| 宽甸| 沂源县| 耿马| 迁安市| 庄河市| 浙江省| 呼伦贝尔市| 建昌县| 松阳县| 宁河县| 高台县| 哈密市| 通江县| 丹江口市| 宣城市| 道孚县| 精河县| 绥江县| 健康| 南木林县| 靖西县| 罗山县| 大化| 抚宁县| 淮北市| 和田市| 华坪县| 凤山县| 正蓝旗| 拉萨市| 胶州市| 万源市| 石家庄市| 平度市| 连平县| 会泽县|