偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

聊聊Python私有屬性與私有方法

開(kāi)發(fā) 后端
在 Python 中,并沒(méi)有真正意義上的私有,因?yàn)?Python 內(nèi)部在給屬性、方法命名時(shí),對(duì)名稱(chēng)做了一些特殊處理,使得外界無(wú)法訪問(wèn)到對(duì)應(yīng)的屬性和方法。

1、 場(chǎng)景定義

私有屬性

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

即:私有屬性是對(duì)象不愿意公開(kāi)的屬性。

私有方法

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

即:私有方法是對(duì)象不愿意公開(kāi)的方法或函數(shù)。

2、 語(yǔ)法定義

在 Python 中定義私有屬性和私有方法的語(yǔ)法如下:

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è)下劃線開(kāi)頭來(lái)定義的私有屬性。

(2). __secret(self)是以兩個(gè)下劃線開(kāi)頭來(lái)定義的私有方法。

3、 調(diào)用分析

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

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

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

為了證明 Staff 類(lèi)對(duì)象確實(shí)是有__salary 這個(gè)實(shí)例屬性的,只是因?yàn)樵趯?duì)象外部不能訪問(wèn)私有屬性。

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

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

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

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

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

為了證明 Staff 類(lèi)對(duì)象是有__secret(self)這個(gè)實(shí)例方法的,只是因?yàn)樵趯?duì)象外部不能訪問(wèn)私有方法。

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

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

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

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

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

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

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

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

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

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

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

知道了 Python 內(nèi)部對(duì)于私有屬性和私有方法的處理,現(xiàn)在使用這種處理后的命名方式來(lái)在對(duì)象外部訪問(wèn)私有屬性和私有方法,看是否能訪問(wè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é)果如下圖所示

控制臺(tái)沒(méi)有拋任何的異常,之前的提示 AttributeError 錯(cuò)誤也沒(méi)有了。

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

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

這里只是想通過(guò)這個(gè)小例子來(lái)說(shuō)明 Python 并無(wú)真正意義上的私有。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-09-16 19:38:17

Python私有屬性私有方法

2012-03-13 16:14:09

JavaJUnit

2011-08-16 10:35:59

Objective_C私有方法

2020-07-22 14:10:17

Chrome 84空閑檢測(cè)前端

2009-07-21 17:26:09

Scala本地函數(shù)

2011-09-29 09:48:39

私有云PaaS云計(jì)算

2012-03-27 14:25:23

私有云PaaS云計(jì)算

2011-09-15 09:31:32

云計(jì)算PaaS私有云

2024-06-03 10:26:47

Python裝飾器對(duì)象編程

2023-11-06 07:21:02

DBaaSApachealpha版本

2017-10-08 22:11:03

Python私有制Java

2017-06-01 14:28:07

2015-05-28 13:42:08

2011-11-02 09:36:51

私有云云計(jì)算

2018-09-19 13:56:46

2016-07-06 15:56:05

云計(jì)算

2011-10-21 14:24:03

私有云云計(jì)算

2012-08-07 08:52:53

私有云公有云云計(jì)算

2024-03-07 09:37:45

C#表達(dá)式(樹(shù))動(dòng)態(tài)方法

2012-07-31 16:34:46

私有云公有云
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)