Python的@property的使用
通常,當(dāng)我們需要對(duì)對(duì)象的敏感屬性或者不希望外部直接訪問(wèn)的屬性進(jìn)行私有化,但是某些時(shí)候我們又需要對(duì)這些私有屬性進(jìn)行修改,該怎么處理呢?
1、幾個(gè)概念
- _a(前置單下劃線),這種屬性僅表示約定的私有,非真正的私有。
- __a(前置雙下劃線),這種屬性表示私有,無(wú)法在外部訪問(wèn)。
- _a_(前后雙下劃線),這種屬性標(biāo)識(shí)系統(tǒng)屬性。(可選)
- a_(后置單下劃線),這種屬性是為了避免和保留關(guān)鍵字沖突。(可選)
2、舉個(gè)例子
定義一個(gè)類:
class Student(object): _sex='male' __age=0
執(zhí)行:(私有屬性無(wú)法在外部訪問(wèn))
>>> stu = Student() >>> stu._sex 'male' >>> stu.__age Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute '__age' >>>
3、解決問(wèn)題
從上面的類中我們可以看到,私有屬性無(wú)法在類實(shí)例中訪問(wèn),怎么辦呢?當(dāng)我們需要對(duì)類的私有屬性__age進(jìn)行查詢和修改的時(shí)候,我們可以定義get_age和set_age去實(shí)現(xiàn)。
class Student(object): _sex='male' __age=0 def get_age(self): return self.__age def set_age(self,age): self.__age = age
執(zhí)行:
>>> stu = Student() >>> stu.get_age() 0 >>> stu.set_age(18) >>> stu.get_age() 18 >>>
4、換個(gè)方法
但是上面的這種方式略顯復(fù)雜,如果在私有屬性較多的類中就不太適用了,所以我們期望尋求一種更簡(jiǎn)單的方式去解決這個(gè)問(wèn)題,比如將這個(gè)私有屬性轉(zhuǎn)化為另一個(gè)屬性。告訴你個(gè)好消息,Python已經(jīng)幫我們實(shí)現(xiàn)了,這就是@property。
class Student(object): _sex='male' __age=0 def get_age(self): return self.__age def set_age(self,age): self.__age = age @property def age(self): return self.__age
執(zhí)行:
>>> from payhlib import Student >>> s = Student() >>> s.age 0 >>> s.set_age(19) >>> s.age 19 >>
在上面我們將__age私有屬性轉(zhuǎn)換為了age屬性,你可能會(huì)想,既然私有屬性轉(zhuǎn)換為了屬性,那我們是不是可以直接修改它呢?答案是不行,因?yàn)閜roperty雖然將__age轉(zhuǎn)換為了屬性,但是其不具備setter功能,需要我們?nèi)ヌ砑印?br />
>>> from payhlib import Student >>> s = Student() >>> s.age 0 >>> s.age=20 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can't set attribute >>>
添加setter方法
class Student(object): _sex='male' __age=0 def get_age(self): return self.__age def set_age(self,age): self.__age = age @property def age(self): return self.__age @age.setter def age(self,value): self.__age=value
執(zhí)行:
>>> from payhlib import Student >>> s = Student() >>> s.age 0 >>> s.age=20 >>> s.age 20 >>>
到此,@peoperty分享完畢,關(guān)于它的實(shí)現(xiàn)原理你可以查看源碼進(jìn)行研究。更多相關(guān)Python的@property內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 掌握Python property裝飾器巧妙管理類的屬性
- python裝飾器中@property屬性的使用解析
- Python中通過(guò)property設(shè)置類屬性的訪問(wèn)
- 關(guān)于python中@property的使用方法
- Python?property裝飾器使用案例介紹
- Python深入分析@property裝飾器的應(yīng)用
- python 中的@property的用法詳解
- python中@Property屬性使用方法
- Python中property屬性的用處詳解
- Python裝飾器中@property使用詳解
- Python中關(guān)于property使用的小技巧
- 詳解Python裝飾器之@property
- Python property函數(shù)的具體使用
相關(guān)文章
如何使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的ORM模型
ORM(Object Relational Mapping)是一種程序設(shè)計(jì)技術(shù),用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z(yǔ)言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。本文將介紹如何使用Python實(shí)現(xiàn)一個(gè)簡(jiǎn)易的ORM2021-05-05Python PyQt5實(shí)戰(zhàn)項(xiàng)目之查詢器的實(shí)現(xiàn)流程詳解
PyQt5以一套Python模塊的形式來(lái)實(shí)現(xiàn)功能。它包含了超過(guò)620個(gè)類,600個(gè)方法和函數(shù)。它是一個(gè)多平臺(tái)的工具套件,它可以運(yùn)行在所有的主流操作系統(tǒng)中,包含Unix,Windows和Mac OS。PyQt5采用雙重許可模式。開發(fā)者可以在GPL和社區(qū)授權(quán)之間選擇2021-11-11Python實(shí)現(xiàn)迪杰斯特拉算法過(guò)程解析
這篇文章主要介紹了Python實(shí)現(xiàn)迪杰斯特拉算法過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09人工智能-Python實(shí)現(xiàn)多項(xiàng)式回歸
這篇文章主要介紹了人工智能-Python實(shí)現(xiàn)多項(xiàng)式回歸,上一次我們講解了線性回歸,這次我們重點(diǎn)分析多項(xiàng)式回歸,需要的小伙伴可以參考一下2022-01-01python 中不同包 類 方法 之間的調(diào)用詳解
這篇文章主要介紹了python 中不同包 類 方法 之間的調(diào)用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python?pandas處理缺失值方法詳解(dropna、drop、fillna)
缺失數(shù)據(jù)會(huì)在很多數(shù)據(jù)分析應(yīng)用中出現(xiàn),pandas的目標(biāo)之一就是盡可能無(wú)痛地處理缺失值,下面這篇文章主要給大家介紹了關(guān)于Python?pandas處理缺失值方法的相關(guān)資料,處理方法分別是dropna、drop、fillna,需要的朋友可以參考下2022-08-08python多進(jìn)程使用apply_async的使用方法詳解
這篇文章主要介紹了python多進(jìn)程使用apply_async使用方法詳解,apply_async是異步非阻塞式,不用等待當(dāng)前進(jìn)程執(zhí)行完畢,隨時(shí)跟進(jìn)操作系統(tǒng)調(diào)度來(lái)進(jìn)行進(jìn)程切換,即多個(gè)進(jìn)程并行執(zhí)行,提高程序的執(zhí)行效率2022-09-09