国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-23 04:41:43
字體:
來源:轉載
供稿:網友
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 <module>
obj.m2(1)
TypeError: m2() takes exactly 3 arguments (2 given)
由于method調用期間self的隱式參數傳遞,上述錯誤信息實際是說應該這樣調用method:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永嘉县| 朔州市| 延边| 商城县| 越西县| 莆田市| 正定县| 平安县| 新绛县| 绵阳市| 和政县| 睢宁县| 孟津县| 扶沟县| 尤溪县| 东台市| 松原市| 外汇| 宿松县| 宿松县| 泾源县| 米泉市| 六盘水市| 林周县| 临沂市| 稷山县| 岱山县| 错那县| 南投市| 嘉祥县| 平泉县| 汕头市| 竹北市| 楚雄市| 灌云县| 西乌珠穆沁旗| 库尔勒市| 三门峡市| 柯坪县| 水城县| 长兴县|