如何防止创建新属性?
使用类
要控制新属性的创建,您可以覆盖该__setattr__
方法。每次调用都会my_obj.x = 123
调用它。
请参阅文档:
class A:
def __init__(self):
# Call object.__setattr__ to bypass the attribute checking
super().__setattr__('x', 123)
def __setattr__(self, name, value):
# Cannot create new attributes
if not hasattr(self, name):
raise AttributeError('Cannot set new attributes')
# Can update existing attributes
super().__setattr__(name, value)
a = A()
a.x = 123 # Allowed
a.y = 456 # raise AttributeError
请注意,如果用户直接调用,仍然可以绕过检查object.__setattr__(a, 'attr_name', attr_value)
。
使用数据类
使用dataclasses
,您可以使用 禁止创建新属性frozen=True
。它还将阻止更新现有属性。
@dataclasses.dataclass(frozen=True)
class A:
x: int
a = A(x=123)
a.y = 123 # Raise FrozenInstanceError
a.x = 123 # Raise FrozenInstanceError
注意:dataclasses.FrozenInstanceError
是 AttributeError 的子类