目錄
- 1、幾個(gè)概念
- 2、舉個(gè)例子
- 3、解決問(wèn)題
- 4、換個(gè)方法
通常,當(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è)類(lèi):
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)題
從上面的類(lèi)中我們可以看到,私有屬性無(wú)法在類(lèi)實(shí)例中訪問(wèn),怎么辦呢?當(dāng)我們需要對(duì)類(lèi)的私有屬性__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ù)雜,如果在私有屬性較多的類(lèi)中就不太適用了,所以我們期望尋求一種更簡(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ān)于property的最詳細(xì)使用方法
- python中@property的作用和getter setter的解釋
- Python中關(guān)于property使用的小技巧