類(lèi)的私有變量和私有方法
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)桐柏,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220
在Python中可以通過(guò)在屬性變量名前加上雙下劃線(xiàn)定義屬性為私有屬性
特殊變量命名
1、 _xx 以單下劃線(xiàn)開(kāi)頭的表示的是protected類(lèi)型的變量。即保護(hù)類(lèi)型只能允許其本身與子類(lèi)進(jìn)行訪問(wèn)。若內(nèi)部變量標(biāo)示,如: 當(dāng)使用“from M import”時(shí),不會(huì)將以一個(gè)下劃線(xiàn)開(kāi)頭的對(duì)象引入 。
2、 __xx 雙下劃線(xiàn)的表示的是私有類(lèi)型的變量。只能允許這個(gè)類(lèi)本身進(jìn)行訪問(wèn)了,連子類(lèi)也不可以用于命名一個(gè)類(lèi)屬性(類(lèi)變量),調(diào)用時(shí)名字被改變(在類(lèi)FooBar內(nèi)部,__boo變成_FooBar__boo,如self._FooBar__boo)
3、 __xx__定義的是特列方法。用戶(hù)控制的命名空間內(nèi)的變量或是屬性,如init , __import__或是file 。只有當(dāng)文檔有說(shuō)明時(shí)使用,不要自己定義這類(lèi)變量。 (就是說(shuō)這些是python內(nèi)部定義的變量名)
在這里強(qiáng)調(diào)說(shuō)一下私有變量,python默認(rèn)的成員函數(shù)和成員變量都是公開(kāi)的,沒(méi)有像其他類(lèi)似語(yǔ)言的public,private等關(guān)鍵字修飾.但是可以在變量前面加上兩個(gè)下劃線(xiàn)"_",這樣的話(huà)函數(shù)或變量就變成私有的.這是python的私有變量軋壓(這個(gè)翻譯好拗口),英文是(private name mangling.) **情況就是當(dāng)變量被標(biāo)記為私有后,在變量的前端插入類(lèi)名,再類(lèi)名前添加一個(gè)下劃線(xiàn)"_",即形成了_ClassName__變量名.**
Python內(nèi)置類(lèi)屬性
__dict__ : 類(lèi)的屬性(包含一個(gè)字典,由類(lèi)的數(shù)據(jù)屬性組成)
__doc__ :類(lèi)的文檔字符串
__module__: 類(lèi)定義所在的模塊(類(lèi)的全名是'__main__.className',如果類(lèi)位于一個(gè)導(dǎo)入模塊mymod中,那么className.__module__ 等于 mymod)
__bases__ : 類(lèi)的所有父類(lèi)構(gòu)成元素(包含了一個(gè)由所有父類(lèi)組成的元組)
Python中如何實(shí)現(xiàn)運(yùn)算符的重載,即實(shí)現(xiàn)例如a+b這樣的運(yùn)算符操作呢?
在C++中可以使用 operator 關(guān)鍵字實(shí)現(xiàn)運(yùn)算符的重載。但是在Python中沒(méi)有類(lèi)似這樣的關(guān)鍵字,所以要實(shí)現(xiàn)運(yùn)算符的重載,就要用到Python的魔法函數(shù)。Python魔法函數(shù)是以雙下劃線(xiàn)開(kāi)頭,雙下劃線(xiàn)結(jié)尾的一組函數(shù)。我們?cè)陬?lèi)定義中最常用到的 __init__ 函數(shù)就是這樣一個(gè)魔法函數(shù),它在創(chuàng)建類(lèi)對(duì)象時(shí)被自動(dòng)調(diào)用。
下面我們來(lái)看個(gè)簡(jiǎn)單的例子。
上述代碼示例了幾個(gè)魔法函數(shù)的用法。 __add__ 函數(shù)對(duì)應(yīng)了二元運(yùn)算符+,當(dāng)執(zhí)行a+b語(yǔ)句時(shí),python就會(huì)自動(dòng)調(diào)用a. add (b)。 對(duì)于上述例子中的v1+v2+v3,則相當(dāng)于調(diào)用了(v1. add(v2)). add(v3)。
代碼中還有一個(gè)在Python類(lèi)定義經(jīng)常使用的 __str__ 函數(shù),當(dāng)使用 str() 時(shí)會(huì)被調(diào)用。print函數(shù)對(duì)傳入的參數(shù)都調(diào)用了str()將其轉(zhuǎn)換成易讀的字符串形式,便于打印輸出,因而會(huì)調(diào)用類(lèi)定義的__str__函數(shù)打出自定義的字符串。
代碼中還有一個(gè)特殊的 __call__ 函數(shù),該函數(shù)在將對(duì)象采用函數(shù)調(diào)用方式使用時(shí)被調(diào)用, 例如v1()相當(dāng)于v1. call ()。
以上就是魔法函數(shù)的基本使用方法。常見(jiàn)的魔法函數(shù)我們可以使用 dir() 函數(shù)來(lái)查看。
輸出結(jié)果為:
上述結(jié)果中形式為‘__函數(shù)名__’的函數(shù)為魔法函數(shù),注意有些對(duì)象也是這種形式,例如__class__, __module__等, 這些不是魔法函數(shù)。具體的魔法函數(shù)說(shuō)明可以參考Python官方說(shuō)明文檔。
以上代碼在Python3.6運(yùn)行通過(guò).
前后各有兩個(gè)下劃線(xiàn),說(shuō)明是類(lèi)的內(nèi)置方法,用于操作符重載等用途,自己寫(xiě)的函數(shù)避免使用前后兩個(gè)下劃線(xiàn)
前面有兩個(gè)下劃線(xiàn),表示偽私有方法,不能在類(lèi)外用原始名字直接調(diào)用
前面一個(gè)下劃線(xiàn),表示自己寫(xiě)的特殊用途的方法