python設(shè)置只讀屬性的方式有兩種
- 1.通過
property裝飾器和私有屬性配合完成只讀屬性
- 2.借助__setter__方法,設(shè)置邏輯阻止賦值
方式一:
class Task(object):
def __init__(self):
self.__x = 1 # 在python中私有屬性__會有一層保護機制的(改變名字),在類外面調(diào)用的時候不再是__x這個名字,
# 但再類的內(nèi)部變量的名字還是__x
@property # 通過property裝飾器只通過get方法,不提供set方法和delete方法來實現(xiàn)只讀
def get_x(self):
return self.__x
task = Task()
try:
print(task.__x)
except Exception as e:
print("no __x")
print(task.get_x)
輸出結(jié)果:
no __x
1
點擊查看property的詳細使用
方式二:
class Task(object):
def __init__(self):
self.a=2 # 注意這里寫 self.a不起作用的,因為被__setter__方法攔截了,下面的調(diào)用task.a會報錯
def __setattr__(self, key, value):
if key == "a":
pass
else:
super(Task, self).__setattr__(key,value)
task = Task()
print(task.a)
task.a = 10
print(task.a)
報錯:
AttributeError: 'Task' object has no attribute 'a'
這是因為self.a被攔截了,根本就沒有a這個實例屬性
想要不報錯,就需要設(shè)置一個類屬性,
所有的實例共用這個類屬性,但是所有的實例的__setter__方法又被修改了,
所以所有的實例都是繼承這個類屬性,沒有辦法修改,變相實現(xiàn)了只讀屬性,代碼如下
class Task(object):
a = 1
def __init__(self):
pass
def __setattr__(self, key, value):
if key == "a":
pass
else:
super(Task, self).__setattr__(key,value)
task = Task()
print(task.a)
task.a = 10
print(task.a)
輸出結(jié)果:
1
1
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。