第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何防止 Python 中的類字段(列表)更改?

如何防止 Python 中的類字段(列表)更改?

慕桂英3389331 2021-08-24 18:16:09
例如,我有一個帶有字段的類__x,它是一個列表:class C():    def __init__(self, xx):        self.__x = xx    @property    def x(self):        return self.__x    @x.setter    def x(self, xx):        raise Exception("Attempt to change an immutable field")我可以防止諸如此類的更改:c = C([1,2,3])c.x = [3,2,1]但是我怎樣才能防止這樣的變化呢?c.x.append(4)
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

歸根結(jié)底,您無法保護您的對象免受檢查和操縱。另外,總是問自己“究竟來自誰?” 當您想“保護”數(shù)據(jù)時。

有時,圍繞不閱讀文檔的用戶編寫代碼是不值得的。

話雖如此,你可以考慮return tuple(self.__x)在吸氣劑中。另一方面,如果__x包含其他可變對象,則不會阻止用戶操作這些內(nèi)部對象。(return list(self.__x)也將返回數(shù)據(jù)的淺拷貝,但隱含的“嘿,我應(yīng)該是不可變的!”信號。)

您絕對應(yīng)該考慮的是在方法中更改self.__x = xx為,以便用戶執(zhí)行self.__x = list(xx)__init__

var = []
c = C(var)

不能“輕松”(或錯誤地,同樣,可能存在可變的內(nèi)部對象)c通過 mutating改變 的狀態(tài)var。


查看完整回答
反對 回復(fù) 2021-08-24
?
皈依舞

TA貢獻1851條經(jīng)驗 獲得超3個贊

最簡單的方法是接受一個可迭代對象__init__并在內(nèi)部將其轉(zhuǎn)換為元組:


class C(object):

    def __init__(self, iterable):

        self._tuple = tuple(iterable)


    @property

    def x(self):

        return self._tuple


    @x.setter

    def x(self, value):

      raise RuntimeError('can\'t reset the x attribute.')


c = C([1, 2, 3])

# c.x = 'a' Will raise 'RuntimeError: can't reset the x attribute.'

print(c.x)

像這樣的設(shè)計使從類實例化的任何對象都是不可變的,因此變異操作應(yīng)該返回新對象而不是更改當前對象的狀態(tài)。


例如,假設(shè)您要實現(xiàn)一個函數(shù),該函數(shù)使 中的每個項目遞增 1 self.x。使用這種方法,您需要編寫類似于以下內(nèi)容的內(nèi)容:


def increment_by_one(c):

  return C(t+1 for t in c.x)

由于創(chuàng)建和銷毀對象會產(chǎn)生相關(guān)成本x,因此應(yīng)根據(jù)您的用例評估此方法(防止屬性突變)與 @timgeb 建議的方法之間的權(quán)衡。


查看完整回答
反對 回復(fù) 2021-08-24
  • 2 回答
  • 0 關(guān)注
  • 247 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號