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