為什么從類內(nèi)部訪問類變量需要“自我”。在Python中?
摘自Python歷史:添加對(duì)用戶定義類的支持:
相反,我決定放棄隱式引用實(shí)例變量的想法。諸如C ++之類的語言使您可以編寫this->foo來顯式引用實(shí)例變量foo(以防存在單獨(dú)的局部變量foo)。因此,我決定將此類顯式引用作為引用實(shí)例變量的唯一方法。另外,我決定將當(dāng)前對(duì)象(“this”)作為一個(gè)特殊的關(guān)鍵字,而不是簡(jiǎn)單地將“ this”(或其等效)作為第一個(gè)命名參數(shù)。實(shí)例變量總是總是被引用為該參數(shù)的屬性。
使用顯式引用,不需要為方法定義使用特殊的語法,也不必?fù)?dān)心與變量查找有關(guān)的復(fù)雜語義。取而代之的是,僅定義一個(gè)函數(shù),該函數(shù)的第一個(gè)參數(shù)與實(shí)例相對(duì)應(yīng),按照慣例,該實(shí)例稱為“self”。例如:
def spam(self,y): print self.x, y
這種方法類似于我在Modula-3中看到的方法,該方法已經(jīng)為我提供了導(dǎo)入和異常處理的語法。Modula-3沒有類,但是它允許您創(chuàng)建包含完全類型化函數(shù)指針成員的記錄類型,這些成員默認(rèn)情況下初始化為附近定義的函數(shù),并添加語法糖,以便如果x是這樣的記錄變量,而m是一個(gè)該記錄的函數(shù)指針成員,初始化為函數(shù)f,然后調(diào)用xm(args)等效于調(diào)用f(x,args)。這與對(duì)象和方法的典型實(shí)現(xiàn)相匹配,并使得可以將實(shí)例變量與第一個(gè)參數(shù)的屬性等同起來。
因此,由BDFL自己說,他決定使用顯式自我而不是隱式自我的唯一真實(shí)原因是:
這是明確的由于查找必須在運(yùn)行時(shí)完成(而不是像其他語言一樣在編譯時(shí)進(jìn)行),并且具有隱式自身,可能會(huì)增加查找的復(fù)雜性(并因此增加成本),因此它更易于實(shí)現(xiàn)。編輯:Python FAQ中也有一個(gè)答案。
解決方法我正在學(xué)習(xí)Python,對(duì)于這個(gè)類的方法中的訪問類變量,我有一個(gè)比理論更實(shí)際的問題。
例如,我們有:
class ExampleClass: x = 123 def example_method(self):print(self.x)
為什么一定要準(zhǔn)確地寫self.x,而不僅僅是寫x?x屬于類的名稱空間,使用它的方法也屬于該名稱空間。我想念什么?這種風(fēng)格背后的原理是什么?
在C ++中,您可以編寫:
class ExampleClass {public: int x; void example_method() {x = 123;cout << x; };};
它將起作用!
相關(guān)文章:
1. ASP實(shí)現(xiàn)加法驗(yàn)證碼2. CSS可以做的幾個(gè)令你嘆為觀止的實(shí)例分享3. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)4. PHP循環(huán)與分支知識(shí)點(diǎn)梳理5. PHP session反序列化漏洞超詳細(xì)講解6. jsp+servlet簡(jiǎn)單實(shí)現(xiàn)上傳文件功能(保存目錄改進(jìn))7. ASP基礎(chǔ)入門第二篇(ASP基礎(chǔ)知識(shí))8. Spring注入Date類型的三種方法總結(jié)9. ASP基礎(chǔ)知識(shí)Command對(duì)象講解10. ASP動(dòng)態(tài)網(wǎng)頁(yè)制作技術(shù)經(jīng)驗(yàn)分享
