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

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

禁止在 Python 中將類成員設(shè)置為 None

禁止在 Python 中將類成員設(shè)置為 None

紫衣仙女 2023-04-18 15:06:57
Python 中有沒有一種方法可以禁止將類成員設(shè)置為 None 之外__init__?class Dummy:    def __init__(self, x):        if x is not None:            self.x = x        else:            raise Exception("x cannot be None")d = Dummy("foo")d.x = None在我的代碼中,我有類型提示,但這些都不是強(qiáng)制執(zhí)行的,所以說x只能是str并不能真正改變?nèi)魏卧试S的內(nèi)容。
查看完整描述

2 回答

?
LEATH

TA貢獻(xiàn)1936條經(jīng)驗(yàn) 獲得超7個(gè)贊

你需要一個(gè)@property

class Dummy:

? ? def __init__(self, x):

? ? ? ? self.x = x


? ? @property

? ? def x(self):

? ? ? ? return self._x


? ? @x.setter

? ? def x(self, value):

? ? ? ? if value is None:

? ? ? ? ? ? raise Exception("x cannot be None")

? ? ? ? self._x = value



d = Dummy(8)

d.x = 16

d.x = None? # Raises


查看完整回答
反對 回復(fù) 2023-04-18
?
瀟瀟雨雨

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊

注意:我將此處的問題解釋為防止將所有屬性設(shè)置為None之外的意思__init__,盡管在下面添加了一個(gè)選項(xiàng)來保護(hù)某些指定的屬性。


這個(gè)怎么樣?有__setattr__方法作為object.__setattr__.


class Dummy:

    def __init__(self, x):

        self._None_forbidden = False

        self.z = None  # this will work

        self._None_forbidden = True


    def __setattr__(self, k, v):

        if v is None and self._None_forbidden:

            raise ValueError("cannot set attribute to None")

        object.__setattr__(self, k, v)



d = Dummy("foo")

print(d.z)  # None

d.y = 2

print(d.y)  # 2

d.x = None  # raises ValueError

如果只是想保護(hù)某些屬性,可以做成self._None_forbidden一組屬性名,不允許設(shè)置為None。例如:


class Dummy:

    def __init__(self, x):

        self._None_forbidden = set()

        self.z = None  # this will work

        self._None_forbidden.add("z")


    def __setattr__(self, k, v):

        if v is None and k in self._None_forbidden:

            raise ValueError("cannot set attribute to None")

        object.__setattr__(self, k, v)



d = Dummy("foo")

print(d.z)  # None

d.y = 2

print(d.y)  # 2

d.x = None

print(d.x)  # None

d.z = 4

print(d.z)  # 4

d.z = None  # raises ValueError

顯然,如果調(diào)用者操縱了_None_forbidden,那么這是可以規(guī)避的,但是他們應(yīng)該知道他們正在做一些不受支持的事情。


查看完整回答
反對 回復(fù) 2023-04-18
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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