python 私有属性_Python3伪私有属性
1:偽私有屬性介紹
在Python中一切都是對(duì)象,并且類的所有屬性和方法都是公有的(public),并不存在private 關(guān)鍵字來(lái)聲明私有方法或?qū)傩?。那么在Python中怎么實(shí)現(xiàn)像其他編程語(yǔ)言一樣的私有屬性呢?其實(shí)只需在屬性前加上雙下劃線(但是結(jié)尾處不能有雙下劃線)即可,如:self.__name,這并不是真正私有,而是“偽私有”,因?yàn)镻ython會(huì)把self.__name 變?yōu)閟elf._類名__name,你可以使用"對(duì)象._類名__name"訪問(wèn)這個(gè)屬性。
# encoding=gbk class Test: def __init__(self,name): self.__name = name t = Test('ixusy88')print(t.__dict__) # 輸出 {'_Test__name': 'ixusy88'};屬性 __name 變?yōu)?_Test__name了# print(t.__name) # 輸出:AttributeError: 'Test' object has no attribute '__name'; # 不能訪問(wèn)屬性__name,因?yàn)閷傩?__name 變?yōu)?_Test__name了,不存在屬性__name # 可以通過(guò) 對(duì)象._類名__屬性 訪問(wèn)print(t._Test__name)# 通過(guò)下標(biāo)訪問(wèn)print(t.__dict__['_Test__name'])
2:雙下劃線:偽私有屬性實(shí)現(xiàn)過(guò)程
在運(yùn)算符重載中有提到 __setattr__ 能夠攔截所有的屬性賦值操作,__getattr__能夠攔截沒(méi)有定義屬性的訪問(wèn)(即不存在于
__dict__中的屬性)。
其攔截過(guò)程如下:
self.屬性 = 屬性值 會(huì)調(diào)用 self.__setattr__('屬性',屬性值)
self.屬性 = 屬性值 會(huì)調(diào)用 self.__setattr__('_類__屬性',屬性值)
對(duì)象.屬性 = 屬性值 會(huì)調(diào)用 self.__setattr__('屬性',屬性值)
對(duì)象.屬性 = 屬性值 會(huì)調(diào)用 self.__setattr__('屬性',屬性值)
只攔截不處理:
# encoding=gbk class Test: def __init__(self,name,age): self.__name = name # self.__setattr__('_Test__name',name) self.age = age # self.__setattr__('age',age) def __getattr__(self, item): print('in __getattr__:' + item) def __setattr__(self, key, value): print('in __setattr__:' + key,value) def setV(self): self.__a1 = 'a1_11' # self.__setattr__('_Test__a1','a1_11') print('1:' + '*'*30)t = Test('ixusy88',18)print('2:' + '*'*30)print(t.__dict__) # 輸出 {} ,因?yàn)樵赺_setattr__中攔截了所有的屬性賦值,print('3:' + '*'*30)t.setV()print('4:' + '*'*30)t.aa = '123' # self.__setattr__('aa','123')print('5:' + '*'*30)t.__bb = '123' # self.__setattr__('__bb','123')print('6:' + '*'*30)print(t.vv) # self.__getattr__('vv')print('7:' + '*'*30)print(t.age) # self.__getattr__('age') , 在構(gòu)造函數(shù)中雖然有self.age 賦值,但是__getattr__會(huì)攔截所有,print('8:' + '*'*30)print(t.__dict__) # 輸出 {} ,因?yàn)樵赺_setattr__中攔截了所有的屬性賦值, """輸出結(jié)果:1:******************************in __setattr__:_Test__name ixusy88in __setattr__:age 182:******************************{}3:******************************in __setattr__:_Test__a1 a1_114:******************************in __setattr__:aa 1235:******************************in __setattr__:__bb 1236:******************************in __getattr__:vvNone7:******************************in __getattr__:ageNone8:******************************{}"""
正常攔截:
# encoding=gbk class Test: def __init__(self,name,age): self.__name = name # self.__setattr__('_Test__name',name) self.age = age # self.__setattr__('age',age) def __getattr__(self, item): print('in __getattr__:' + item) # raise TypeError('private attribute:' + item) # 拋出異常 def __setattr__(self, key, value): print('in __setattr__:' + key,value) self.__dict__[key] = value def setV(self): self.__a1 = 'a1_11' # self.__setattr__('_Test__a1','a1_11') print('1:' + '*'*30)t = Test('ixusy88',18)print('2:' + '*'*30)print(t.__dict__) # 輸出 {'_Test__name': 'ixusy88', 'age': 18}print('3:' + '*'*30)t.setV()print('4:' + '*'*30)t.aa = '123' # self.__setattr__('aa','123')print('5:' + '*'*30)t.__bb = '123' # self.__setattr__('__bb','123')print('6:' + '*'*30)print(t.vv) # self.__getattr__('vv')print('7:' + '*'*30)print(t.age) # 直接輸出 18,不會(huì)調(diào)用self.__getattr__('age') ,print('8:' + '*'*30)print(t.__dict__) # 輸出 {'_Test__name': 'ixusy88', 'age': 18, '_Test__a1': 'a1_11', 'aa': '123', '__bb': '123'} """輸出:1:******************************in __setattr__:_Test__name ixusy88in __setattr__:age 182:******************************{'_Test__name': 'ixusy88', 'age': 18}3:******************************in __setattr__:_Test__a1 a1_114:******************************in __setattr__:aa 1235:******************************in __setattr__:__bb 1236:******************************in __getattr__:vvNone7:******************************188:******************************{'_Test__name': 'ixusy88', 'age': 18, '_Test__a1': 'a1_11', 'aa': '123', '__bb': '123'}"""
總結(jié)
以上是生活随笔為你收集整理的python 私有属性_Python3伪私有属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用mongoose 在 Node中操作
- 下一篇: Vue3 slot插槽——(默认插槽、具