日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
聊聊Python私有屬性與私有方法

1、 場景定義

私有屬性

是指在 Python 的面向?qū)ο箝_發(fā)過程中,對象的某些屬性只想在對象的內(nèi)部被使用,但不想在外部被訪問到這些屬性。

專業(yè)成都網(wǎng)站建設(shè)公司,做排名好的好網(wǎng)站,排在同行前面,為您帶來客戶和效益!創(chuàng)新互聯(lián)為您提供成都網(wǎng)站建設(shè),五站合一網(wǎng)站設(shè)計制作,服務(wù)好的網(wǎng)站設(shè)計公司,做網(wǎng)站、成都網(wǎng)站設(shè)計負(fù)責(zé)任的成都網(wǎng)站制作公司!

即:私有屬性是對象不愿意公開的屬性。

私有方法

是指在 Python 的面向?qū)ο箝_發(fā)過程中,對象的某些方法或者稱為函數(shù)只想在對象的內(nèi)部被使用,但不想在外部被訪問到這些方法或函數(shù)。

即:私有方法是對象不愿意公開的方法或函數(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是以兩個下劃線開頭來定義的私有屬性。

(2). __secret(self)是以兩個下劃線開頭來定義的私有方法。

3、 調(diào)用分析

(1). 在__init__的對象初始化方法中,以兩個下劃線開頭定義的__salary屬性就是私有屬性。

現(xiàn)在在對象的外部來調(diào)用一下__salary屬性,看是否能正常訪問該私有屬性。

從上圖運(yùn)行結(jié)果可以看出,第11行,即在對象外部訪問對象的私有屬性 __salary 時,提示 AttributeError 錯誤,Staff 對象 zhangsan 沒有屬性 __salary。

為了證明 Staff 類對象確實(shí)是有__salary 這個實(shí)例屬性的,只是因為在對象外部不能訪問私有屬性。

我把 self.__salary 修改為:self.salary,__secret(self)方法對self.__salary屬性的引用,做相應(yīng)的修改,看如下圖所示的運(yùn)行結(jié)果。

可以從運(yùn)行結(jié)果看出,這種非私有屬性在外部的調(diào)用是正常的,沒有提示 AttributeError 錯誤。

(2). 在 __secret(self) 實(shí)例方法中,以兩個下劃線開頭定義的__secret(self)方法就是私有方法。

和上面測試流程一樣,先在對象的外部來調(diào)用私有方法__secret(self),看是否能正常調(diào)用該私有方法。

從上圖運(yùn)行結(jié)果可以看出,第11行,即在對象外部訪問對象的私有方法 __secret(self) 時,提示 AttributeError 錯誤,Staff 對象 zhangsan 沒有 __secret 方法。

為了證明 Staff 類對象是有__secret(self)這個實(shí)例方法的,只是因為在對象外部不能訪問私有方法。

我把 __secret(self) 方法修改為:secret(self),其他代碼不變,看如下圖所示的運(yùn)行結(jié)果。

可以從運(yùn)行結(jié)果看出,這種非私有方法在外部的調(diào)用是正常的,沒有提示 AttributeError 錯誤。

(3). 從下圖可以看出,在對象內(nèi)部私有方法與私有屬性是可以被調(diào)用的。

如圖中的 work 方法調(diào)用了私有方法__secret(self),而私有方法__secret(self)調(diào)用了私有屬性__salary。

在對象外部使用 Staff 類對象 zhangsan 來調(diào)用 work 方法,可以間接訪問到對象的私有屬性和私有方法。

從控制臺輸出結(jié)果來看 work 方法能正常訪問到對象內(nèi)部定義的私有屬性和私有方法。

4、 Python偽私有屬性和私有方法

在 Python 中,并沒有真正意義上的私有,因為 Python 內(nèi)部在給屬性、方法命名時,對名稱做了一些特殊處理,使得外界無法訪問到對應(yīng)的屬性和方法。

以私有屬性和私有方法為例,Python內(nèi)部處理方式為:

(1). 屬性: __salary,經(jīng)過處理后的屬性名為:_Staff__salary(_類名__屬性名)

(2). 方法: __secret,經(jīng)過處理后的方法名為:_Staff__secret(_類名__方法名)

知道了 Python 內(nèi)部對于私有屬性和私有方法的處理,現(xiàn)在使用這種處理后的命名方式來在對象外部訪問私有屬性和私有方法,看是否能訪問正常。

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é)果如下圖所示

控制臺沒有拋任何的異常,之前的提示 AttributeError 錯誤也沒有了。

這個例子證明了 Python 是沒有真正意義上的私有的,當(dāng)知道了其內(nèi)部處理方式后,依然可以使用_類名__屬性名(方法名)的方法來在對象外部訪問到對象內(nèi)部定義的私有屬性和私有方法。

但這種方式在日常工作中是不推薦使用的,既然在對象內(nèi)部定義屬性和方法時,就聲明了其為私有的,調(diào)用方就需要遵守其規(guī)則。

這里只是想通過這個小例子來說明 Python 并無真正意義上的私有。


分享標(biāo)題:聊聊Python私有屬性與私有方法
本文來源:http://m.5511xx.com/article/coisdec.html