python防止隨意修改類屬性的實現(xiàn)方法
如果不想允許隨意修改一個類的某個屬性,常用的方法是使用property裝飾器以及在屬性前加下劃線。
class V: def __init__(self, x): self._x = x @property def x(self): return self._x
雖然這樣是沒法直接修改x了,但還是可以通過_x很輕易地修改x。
>>>v = V(5) >>>v.x 5 >>>v._x 5 >>>v.x = 4 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: cant set attribute >>>v._x = 4 >>>v.x 4
萬一哪天手抖了呢...
但如果使用雙下劃線——
class V: def __init__(self,x): self.__x = x @property def x(self): return self.__x
>>>v = V(5) >>>v.__x = 4 >>>v.__x 4 >>>v.x 5
原因在于python的名稱改寫特性(name mangling)。python會將以雙下劃線開頭的實例屬性名前加上一個下劃線和類名存入實例的__dict__屬性中。
>>>v = V(5) >>>v.__dict__ {'_V__x': 5} >>>v.__x = 4 >>>v.__dict__ {'_V__x': 5, '__x': 4}
當然,修改v.x的值還是可以做到的的,只需通過修改v._V__x就可以了,不過誤操作的可能性已經(jīng)降低很多了。
p.s.類也有__dict__屬性。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Django框架創(chuàng)建mysql連接與使用示例
這篇文章主要介紹了Django框架創(chuàng)建mysql連接與使用,簡單介紹了Linux環(huán)境下mysql的安裝,并結(jié)合實例形式分析了Django框架基于第三方庫pymysql連接mysql數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2019-07-07使用Django和Python創(chuàng)建Json response的方法
下面小編就為大家分享一篇使用Django和Python創(chuàng)建Json response的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03Python 使用 environs 庫定義環(huán)境變量的方法
這篇文章主要介紹了Python 使用 environs 庫來更好地定義環(huán)境變量,本節(jié)我們以 Python 項目為例,說說環(huán)境變量的設置。通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02NumPy?與?Python?內(nèi)置列表計算標準差區(qū)別詳析
這篇文章主要介紹了NumPy與Python內(nèi)置列表計算標準差區(qū)別詳析,NumPy,是Numerical?Python的簡稱,用于高性能科學計算和數(shù)據(jù)分析的基礎包,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-07-07在Windows8上的搭建Python和Django環(huán)境
作為一個.NET程序員,真心不喜歡以及PHP這種松散的語法。有人說,程序員應該多學幾門語言,本想學習Java,無奈感覺Java的語法太啰嗦了。很多人都推薦Python,說它的語法簡潔,執(zhí)行效率高。趁這兩天空閑,開始學習Python。2014-07-07