国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Python中怎么實(shí)現訪(fǎng)問(wèn)控制

發(fā)布時(shí)間:2021-07-10 17:40 來(lái)源:億速云 閱讀:0 作者:Leah 欄目: 編程語(yǔ)言 歡迎投稿:712375056

本篇文章給大家分享的是有關(guān)Python中怎么實(shí)現訪(fǎng)問(wèn)控制,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習,希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著(zhù)小編一起來(lái)看看吧。

屬性的種類(lèi)

通過(guò)之前的內容,我們知道,在定義一個(gè)類(lèi)時(shí),類(lèi)內部可以有屬性和方法。我們仍然創(chuàng )建一個(gè)學(xué)生類(lèi)Student。

Student類(lèi)

定義好一個(gè)類(lèi)后,我們就可以在類(lèi)的外部通過(guò)生成對象來(lái)使用對象的實(shí)例變量或調用成員方法來(lái)操作數據,從而隱藏類(lèi)內部的代碼邏輯。但是,從類(lèi)Student的定義來(lái)看,在類(lèi)的外部,我們依然可以通過(guò)“對象.屬性”的方式對屬性進(jìn)行任意修改。

修改屬性

上述代碼中,我們在類(lèi)的外部生成了一個(gè)對象student1,通過(guò)student1.name的方式將name修改為CCC,student1的name屬性就被修改了。然而,在面向對象編程中,我們往往不希望類(lèi)內部的屬性被類(lèi)外部的代碼直接修改和訪(fǎng)問(wèn),因此,私有變量的概念應運而生了。

私有變量顧名思義是私有的,類(lèi)的私有變量只允許類(lèi)內部代碼操作。Python中,私有變量就是在屬性開(kāi)頭加兩個(gè)下劃線(xiàn)“__”。

私有變量

可以看到,一旦將屬性設置為私有變量,如果我們試圖通過(guò)“對象.私有變量”來(lái)直接訪(fǎng)問(wèn)的話(huà),Python就會(huì )報錯了。

Python中,類(lèi)的屬性可以分為公有變量和私有變量?jì)煞N,公有變量允許類(lèi)的外部代碼通過(guò)“對象.屬性”的方式直接進(jìn)行修改和獲取,而私有變量則不允許外部代碼直接訪(fǎng)問(wèn)。其中,私有變量的命名以?xún)蓚€(gè)下劃線(xiàn)“__”開(kāi)頭。

需要注意的是,Python中變量名類(lèi)似__xxx__的,也就是以雙下劃線(xiàn)開(kāi)頭,并以雙下劃線(xiàn)結尾的變量不屬于私有變量,因此,我們不能使用類(lèi)似__name__這樣的變量名作為私有變量。

在開(kāi)發(fā)過(guò)程中,我們有時(shí)會(huì )碰到以一個(gè)下劃線(xiàn)開(kāi)頭的實(shí)例變量名,比如_age。

單下劃線(xiàn)開(kāi)頭的實(shí)例變量

從上述代碼中我們可以看到,以一個(gè)下劃線(xiàn)開(kāi)頭的實(shí)例變量是可以直接在類(lèi)的外部代碼中通過(guò)“對象.屬性”的方式進(jìn)行訪(fǎng)問(wèn)的。但是,Python中有個(gè)約定俗成的規定,如果你看到別人的代碼中使用了這種以一個(gè)下劃線(xiàn)開(kāi)頭的實(shí)例變量,那么你應該把它當做私有變量,不要直接在外部代碼中進(jìn)行訪(fǎng)問(wèn)。

私有變量的訪(fǎng)問(wèn)

在定義類(lèi)的時(shí)候,如果把屬性設置成私有變量,就不能在類(lèi)的外部代碼中直接訪(fǎng)問(wèn)了。上述代碼中,如果我們想要修改或獲取私有變量__name,我們可以通過(guò)給Student類(lèi)創(chuàng )建成員方法get_name( )和set_name( )來(lái)對__name進(jìn)行獲取和修改。

成員方法set/get

有了get_name( )方法和set_name( )方法后,我們就可以通過(guò)對象調用成員方法來(lái)對私有變量__name進(jìn)行訪(fǎng)問(wèn)了?;蛟S看到這里,你會(huì )有這樣的疑問(wèn):通過(guò)“對象.屬性”的方式也可以對屬性進(jìn)行修改和獲取,為什么一定要設置成私有變量呢?除了封裝性上的要求外,使用成員方法還可以給修改設置限制。

設置修改限制

上述代碼中,我們將學(xué)生的年齡限制在10~40之間。此時(shí),若外部代碼試圖用一個(gè)不在此范圍內的年齡進(jìn)行修改時(shí),就會(huì )修改失敗。通過(guò)成員方法修改私有變量可以對傳入的參數進(jìn)行校驗,避免傳入無(wú)效的參數。

如果你剛剛在設置私有變量__name的時(shí)候試過(guò)在外部代碼中使用“對象.__name = 值”的方式,你會(huì )發(fā)現Python并沒(méi)有報錯,甚至在賦值后可以使用“print(對象.__name)”獲取到__name的值。實(shí)際上,你用上述方式操作的__name并不是定義類(lèi)時(shí)的那個(gè)私有變量__name,我們看一下以下代碼。

對象綁定實(shí)例變量

可以看到,雖然通過(guò)“對象.屬性”的方式我們修改了一個(gè)叫__name的變量,但當我們調用get_name( )方法的時(shí)候,私有變量__name的值并沒(méi)有被修改。這是因為,Python允許對象綁定任意屬性,student1.__name操作的__name只是新綁定的一個(gè)屬性而已,它和定義類(lèi)時(shí)定義的私有變量__name雖然名字相同,卻是兩個(gè)不同的變量。

那么私有變量是不是一定不能從外部訪(fǎng)問(wèn)呢?在Python中,我們之所以不能直接訪(fǎng)問(wèn)私有變量__name,是因為Python解釋器對外把__name變量改成了_Student__name。換句話(huà)說(shuō),其實(shí)我們是可以通過(guò)“_類(lèi)名+私有變量名”的方式來(lái)直接訪(fǎng)問(wèn)私有變量的。

私有變量的變向直接訪(fǎng)問(wèn)

雖然我們可以通過(guò)這種變相的方式直接訪(fǎng)問(wèn)私有變量,但是在實(shí)際開(kāi)發(fā)中,我們基本上是抵制這種寫(xiě)法的,因為不同版本的Python解釋器可能會(huì )把私有變量改成不同的變量名。

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲无线看天堂av| 清纯校花自慰呻吟流白浆| 亚洲 欧美 日本 国产 高清| 国产精品国产自线拍免费软件| 日韩乱码人妻无码中文字幕| 无码一区二区三区免费视频|