python 面向对象 私有化浅析
· 前言
近幾日,學(xué)校的python課程學(xué)到了面向?qū)ο筮@一塊內(nèi)容,在做作業(yè)的時(shí)候看到老師布置的內(nèi)容有關(guān)于getters、setters兩個(gè)方法的使用操作;可是老師既沒(méi)講清楚,度娘搜到的結(jié)果也模模糊糊,沒(méi)有介紹清楚這一概念,看文章說(shuō)是被@property 裝飾器來(lái)替代了功能,以至于現(xiàn)在gettes、setters用法很少。(有興趣可以參考文章為什么不需要為Python對(duì)象添加 getter 和 setter)本來(lái)我對(duì)面向?qū)ο蟮牧私庖膊皇翘?#xff0c;現(xiàn)在我整理一下學(xué)習(xí)思路。
?
·私有屬性
Python的類里面默認(rèn)的成員函數(shù)和成員變量都是公開(kāi)的,Python?私有屬性和方法沒(méi)有類似別的語(yǔ)言的public,private等關(guān)鍵詞來(lái)修飾。 在python中定義私有變量只需要在變量名或函數(shù)名前加上 "__"兩個(gè)下劃線,那么這個(gè)函數(shù)或變量就會(huì)為私有的了。
(python內(nèi)最簡(jiǎn)單的一個(gè)類結(jié)構(gòu),包含公開(kāi)變量和公開(kāi)方法)
??
現(xiàn)在在__self__初始化函數(shù)內(nèi)定義私有變量,無(wú)法在外部讀取私有變量,會(huì)報(bào)錯(cuò):沒(méi)有 “__num” 屬性。
·gettes、setters方法應(yīng)用淺析:
定義getNum() 方式獲取私有變量__num值,setNum()方式更新私有變量__num值。
class Test(object): def __init__(self): self.__num = 100 def getNum(self): return self.__num def setNum(self,value)self.__num = valuet1 = Test() print(t1.getNum()) t1.setNum(200) print(t1.getNum())?
·私有屬性的其他一些騷操作
(1)新建一個(gè)py(soc.py)文件下面變量:
? ipython3在同目錄下打開(kāi),通過(guò)from xxx import *方式導(dǎo)入剛才的文件并嘗試訪問(wèn)文件內(nèi)的上述三個(gè)變量:
只有num1可以被訪問(wèn)到,后面的下劃線開(kāi)頭的和下劃線下劃線開(kāi)頭的變量名稱都不能被訪問(wèn)到。
可是如果用import XXX方式重新導(dǎo)入文件并訪問(wèn)卻都可以做到:
?(2)命名重整
以前面的文件test的Test類為例,__init__方法內(nèi)定義了一個(gè)私有變量__num,實(shí)例無(wú)法直接訪問(wèn)到 ,根本原因其實(shí)是解釋器給__num變量換了一個(gè)名字:
(順便吹一波ipython工具的強(qiáng)大之處~~~)
? 在私有變量名稱前面加上了'_類名',組成新的變量名稱……_Test__num,可見(jiàn)python是很不期望實(shí)體能訪問(wèn)到根類的私有變量的,這對(duì)于保密性具有很強(qiáng)的現(xiàn)實(shí)意義。
·總結(jié)
變量名類似于
(1)xxx? 公有變量
(2)_xxx 單前置下劃線,不可被 from xx import * 外部文件引用,類對(duì)象和子類能訪問(wèn)
(3)__xxx 雙前置下劃線,避免與子類中變量名沖突,無(wú)法在外部直接訪問(wèn)(沒(méi)職稱證所以訪問(wèn)不到)
(4)__xxx__?雙前后置下劃線,用戶名字空間內(nèi)置的魔法對(duì)象和方法,自己一般不要輕易定義
?
轉(zhuǎn)載于:https://www.cnblogs.com/Higgerw/p/10725810.html
總結(jié)
以上是生活随笔為你收集整理的python 面向对象 私有化浅析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: js06--函数库jq与prototyp
- 下一篇: vmware centos7 扩展容量