如何利用Python實現許可權設置?有些人只怕連這個操作都沒想到過!
一、私有化的實現
在Python中想定義一個類是比較簡單的,比如要定義一個Person類,如下代碼即可:
當然我們也可以給類添加相應的屬性,比如Person的姓名,年齡,性別等,並且在new一個Person對象後可以對這些屬性進行修改,如下代碼所示:
Python是面向對象的語言,我們都知道面向對象的三大特點:繼承、封裝和多態。而在上面的代碼中,我們可以輕易地通過person. 調用屬性來訪問和修改值,這明顯不符合面向對象中封裝的思想。比如對於Person類中的年齡屬性,可能比較私人,所以我們不希望可以任意的訪問和修改它的值。在Java中,我們是通過private關鍵字來裝飾屬性私有,那麼在Python中有沒有類似的關鍵字呢?顯然是有的,在Python中採取在變數名前加__(兩個下劃線)的方式來將屬性私有。如下代碼所示:
初看上面的代碼,似乎感覺並沒有達到私有的目的,因為我們通過p1.age還是成功地進行了賦值,程序並沒有報錯。其實這裡是因為Python可以動態地給對象增加屬性和方法,這句話相當於動態地給p1這個對象增加了一個age屬性。所以在我們做了賦值操作之後,我們再次列印p1,age的值依然是18。說明我們確實已經將類里的age屬性進行的私有。同理方法的私有也是一樣的處理。
二、私有化的注意事項
在Python中,有幾種方式來定義變數:
1、以單劃線開頭:這種類型的變數可以通過對象.調用,但是它表示的意思是我可以調用,但請把我視為是私有的。而且如果是通過from xxx_module import *是無法訪問的,但是如果是import xxx_module的方式,則可以訪問到,類對象和子類也都可以訪問。
2、僅以雙劃線開頭:這種類型的變數就是私有。但是它可以通過__類名__變數名來訪問,但強烈建議不要這樣做
3、以雙劃線開頭,並以它結尾:這種類型的變數在Python中通常都表示具有特殊意義的變數,比如__init__,__str__等。所以我們在定義變數時不要這樣定義
4、僅以單劃線結尾:這種類型的變數是用於避免與Python關鍵字進行衝突所採取的一種解決辦法
如下圖演示訪問許可權效果:
三、property的使用
上面的介紹了,通過加雙劃線開頭的方式實現了變數和方法。參照在學Java時的思路,如果想要訪問私有變數,我們會給變數添加get和set方法。同樣我們在Python中也是一樣的處理,代碼如下所示:
但是這樣看著似乎不是很方便,每次都要調用一個方法。有沒有可能像之前一樣調用p1. age = 28就能直接賦值呢?顯然在Python中是可以的,這就要用到property。
property的定義:
使用代碼示例:
說明:
1. property接受四個參數,分別是get, set, del, doc,前三個參數分別對應get方法,set方法,del方法,順序不能出錯。最後一個參數是doc,相當於對方法進行說明。
2. property返回一個property屬性,返回值的變數名與最終對象. 後面的名稱是一致的
觀察上面的代碼,我們仍然需要多寫一行property的代碼,而Python其實提供了一個更方便的實現方式來達到上述要求,即使用@property。說明如下:
示例代碼如下:
說明:
1. @property相當於對age方法進行了一個裝飾,它使得我們能通過對象.方法名來調用對應的屬性
2. @property所裝飾的方法名與對象 . 調用的名稱要保持一致
3. @property會生成另外的裝飾器,@方法名.setter, @方法名.getter, @方法名.deleter,分別對應set, get, del方法。這裡get方法用得很少,因為已經通過@property直接對應到了get方法
※左手 Python,右手 R 玩轉數據分析
※13條Python2.x和3.x的區別,你知道幾條?
TAG:Python |