python 設(shè)置只讀屬性(property或者__setter__方法)

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ù)。

友情鏈接更多精彩內(nèi)容