禁止在Python中将类成员设置为“无”

2024-05-16 12:12:08 发布

您现在位置:Python中文网/ 问答频道 /正文

Python中有没有一种方法禁止将类成员设置为__init__之外的None

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并不会真正改变允许的内容


Tags: 方法selfnoneifinitisdefexception
2条回答

您需要一个^{}

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

注意:我将此问题解释为防止所有属性被设置为__init__之外的None,尽管我在下面添加了一个选项来保护某些指定属性

这个怎么样?将__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设置为一组不允许设置为“无”的属性名称。例如:

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,那么这是可以避免的,但是他们应该知道他们正在做一些不受支持的事情

相关问题 更多 >