Python?私有屬性與私有方法
1. 場(chǎng)景定義
私有屬性:
是指在 Python 的面向?qū)ο箝_發(fā)過程中,對(duì)象的某些屬性只想在對(duì)象的內(nèi)部被使用,但不想在外部被訪問到這些屬性。
即:私有屬性是對(duì)象不愿意公開的屬性。
私有方法:
是指在 Python 的面向?qū)ο箝_發(fā)過程中,對(duì)象的某些方法或者稱為函數(shù)只想在對(duì)象的內(nèi)部被使用,但不想在外部被訪問到這些方法或函數(shù)。
即:私有方法是對(duì)象不愿意公開的方法或函數(shù)。
2. 語法定義
在 Python 中定義私有屬性和私有方法的語法如下:
class Staff: ? ? def __init__(self, s_name, s_salary): ? ? ? self.s_name = s_name ? ? ? self.__salary = s_salary ? ? ?? ? ? def __secret(self): ? ? ? print("%s 的工資是 %d" % (self.s_name, self.__salary))
- (1). __salary是以兩個(gè)下劃線開頭來定義的私有屬性。
- (2). __secret(self)是以兩個(gè)下劃線開頭來定義的私有方法。
3. 調(diào)用分析
(1). 在__init__的對(duì)象初始化方法中,以兩個(gè)下劃線開頭定義的__salary屬性就是私有屬性。
現(xiàn)在在對(duì)象的外部來調(diào)用一下__salary屬性,看是否能正常訪問該私有屬性。
從上圖運(yùn)行結(jié)果可以看出,第11行,即在對(duì)象外部訪問對(duì)象的私有屬性 __salary 時(shí),提示 AttributeError 錯(cuò)誤,Staff 對(duì)象 zhangsan
沒有屬性 __salary。
為了證明 Staff 類對(duì)象確實(shí)是有__salary 這個(gè)實(shí)例屬性的,只是因?yàn)樵趯?duì)象外部不能訪問私有屬性。
我把 self.__salary 修改為:self.salary
,__secret(self)
方法對(duì)self.__salary屬性的引用,做相應(yīng)的修改,看如下圖所示的運(yùn)行結(jié)果。
可以從運(yùn)行結(jié)果看出,這種非私有屬性在外部的調(diào)用是正常的,沒有提示 AttributeError 錯(cuò)誤。
(2). 在__secret(self)
實(shí)例方法中,以兩個(gè)下劃線開頭定義的__secret(self)
方法就是私有方法。
和上面測(cè)試流程一樣,先在對(duì)象的外部來調(diào)用私有方法__secret(self)
,看是否能正常調(diào)用該私有方法。
從上圖運(yùn)行結(jié)果可以看出,第11行,即在對(duì)象外部訪問對(duì)象的私有方法__secret(self)
時(shí),提示 AttributeError
錯(cuò)誤,Staff 對(duì)象 zhangsan
沒有 __secret
方法。
為了證明 Staff 類對(duì)象是有__secret(self)這個(gè)實(shí)例方法的,只是因?yàn)樵趯?duì)象外部不能訪問私有方法。
我把 __secret(self) 方法修改為:secret(self),其他代碼不變,看如下圖所示的運(yùn)行結(jié)果。
可以從運(yùn)行結(jié)果看出,這種非私有方法在外部的調(diào)用是正常的,沒有提示 AttributeError
錯(cuò)誤。
(3). 從下圖可以看出,在對(duì)象內(nèi)部私有方法與私有屬性是可以被調(diào)用的。
如圖中的 work 方法調(diào)用了私有方法__secret(self),而私有方法__secret(self)
調(diào)用了私有屬性__salary。
在對(duì)象外部使用 Staff
類對(duì)象 zhangsan 來調(diào)用 work 方法,可以間接訪問到對(duì)象的私有屬性和私有方法。
從控制臺(tái)輸出結(jié)果來看 work 方法能正常訪問到對(duì)象內(nèi)部定義的私有屬性和私有方法。
4. Python偽私有屬性和私有方法
在 Python 中,并沒有真正意義上的私有,因?yàn)?Python 內(nèi)部在給屬性、方法命名時(shí),對(duì)名稱做了一些特殊處理,使得外界無法訪問到對(duì)應(yīng)的屬性和方法。
以私有屬性和私有方法為例,Python內(nèi)部處理方式為:
- (1). 屬性: __salary,經(jīng)過處理后的屬性名為:_Staff__salary(_類名__屬性名)
- (2). 方法: __secret,經(jīng)過處理后的方法名為:_Staff__secret(_類名__方法名)
知道了 Python 內(nèi)部對(duì)于私有屬性和私有方法的處理,現(xiàn)在使用這種處理后的命名方式來在對(duì)象外部訪問私有屬性和私有方法,看是否能訪問正常。
class Staff: ? ? def __init__(self, s_name, s_salary): ? ? ? ? self.s_name = s_name ? ? ? ? self.__salary = s_salary ? ? def __secret(self): ? ? ? ? return "%s的工資是 %d" % (self.s_name, self.__salary) zhangsan = Staff("張三", 10000) print(zhangsan._Staff__salary) print(zhangsan._Staff__secret())
運(yùn)行結(jié)果如下圖所示:
控制臺(tái)沒有拋任何的異常,之前的提示 AttributeError
錯(cuò)誤也沒有了。
這個(gè)例子證明了 Python 是沒有真正意義上的私有的,當(dāng)知道了其內(nèi)部處理方式后,依然可以使用_類名__屬性名(方法名)的方法來在對(duì)象外部訪問到對(duì)象內(nèi)部定義的私有屬性和私有方法。
但這種方式在日常工作中是不推薦使用的,既然在對(duì)象內(nèi)部定義屬性和方法時(shí),就聲明了其為私有的,調(diào)用方就需要遵守其規(guī)則。
到此這篇關(guān)于Python 私有屬性與私有方法的文章就介紹到這了,更多相關(guān)Python私有屬性與私有方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式
今天小編就為大家分享一篇Python實(shí)現(xiàn)平行坐標(biāo)圖的繪制(plotly)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python&&GDAL實(shí)現(xiàn)NDVI的計(jì)算方式
今天小編就為大家分享一篇Python&&GDAL實(shí)現(xiàn)NDVI的計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01基于Python的Post請(qǐng)求數(shù)據(jù)爬取的方法詳解
這篇文章主要介紹了基于Python的Post請(qǐng)求數(shù)據(jù)爬取的方法,需要的朋友可以參考下2019-06-06從0到1使用python開發(fā)一個(gè)半自動(dòng)答題小程序的實(shí)現(xiàn)
這篇文章主要介紹了從0到1使用python開發(fā)一個(gè)半自動(dòng)答題小程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05python數(shù)據(jù)持久存儲(chǔ) pickle模塊的基本使用方法解析
這篇文章主要介紹了python數(shù)據(jù)持久存儲(chǔ) pickle模塊的基本使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08