猿问

禁止在 Python 中将类成员设置为 None

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并不能真正改变任何允许的内容。


紫衣仙女
浏览 150回答 2
2回答

LEATH

你需要一个@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 = valued = Dummy(8)d.x = 16d.x = None  # Raises

潇潇雨雨

注意:我将此处的问题解释为防止将所有属性设置为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)  # Noned.y = 2print(d.y)  # 2d.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)  # Noned.y = 2print(d.y)  # 2d.x = Noneprint(d.x)  # Noned.z = 4print(d.z)  # 4d.z = None  # raises ValueError显然,如果调用者操纵了_None_forbidden,那么这是可以规避的,但是他们应该知道他们正在做一些不受支持的事情。
随时随地看视频慕课网APP

相关分类

Python
我要回答