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
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
您需要一个^{} :
注意:我将此问题解释为防止所有属性被设置为
__init__
之外的None
,尽管我在下面添加了一个选项来保护某些指定属性这个怎么样?将
__setattr__
方法作为object.__setattr__
的包装器如果您只是想保护某些属性,那么可以将
self._None_forbidden
设置为一组不允许设置为“无”的属性名称。例如:显然,如果调用方操纵了
_None_forbidden
,那么这是可以避免的,但是他们应该知道他们正在做一些不受支持的事情相关问题 更多 >
编程相关推荐