亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

禁止在 Python 中將類成員設置為 None

禁止在 Python 中將類成員設置為 None

紫衣仙女 2023-04-18 15:06:57
Python 中有沒有一種方法可以禁止將類成員設置為 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在我的代碼中,我有類型提示,但這些都不是強制執行的,所以說x只能是str并不能真正改變任何允許的內容。
查看完整描述

2 回答

?
LEATH

TA貢獻1936條經驗 獲得超7個贊

你需要一個@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


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

TA貢獻1833條經驗 獲得超4個贊

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


這個怎么樣?有__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

如果只是想保護某些屬性,可以做成self._None_forbidden一組屬性名,不允許設置為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

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


查看完整回答
反對 回復 2023-04-18
  • 2 回答
  • 0 關注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號