Python中如何避免类对象因属性名拼写错误新增属性?
如何避免Python对象因属性名拼写错误新增属性
用__slots__限制实例属性(推荐方案)
Python里可以通过__slots__类属性,明确指定实例能拥有的属性名称。一旦定义了__slots__,实例就没法新增未列在其中的属性,拼写错误时会直接抛出AttributeError,正好解决你的问题。
修改你的类:
class class_test: __slots__ = ('name',) # 列出所有允许的属性 def __init__(self, name): self.name = name
测试效果:
a = class_test('John') a.naem = 'Mary' # 直接触发错误:AttributeError: 'class_test' object has no attribute 'naem'
注意:__slots__只对当前类的实例生效。如果子类没定义自己的__slots__,子类实例仍能新增属性(会自动生成__dict__);如果子类也定义了__slots__,会合并父类的规则。
自定义__setattr__方法实现灵活控制
要是需要更灵活的属性校验逻辑,可以重写类的__setattr__方法,手动检查要设置的属性是否在允许列表里,不在就抛出错误。
示例代码:
class class_test: _allowed_attrs = {'name'} # 定义允许的属性集合 def __init__(self, name): self.name = name def __setattr__(self, attr_name, value): if attr_name not in self._allowed_attrs: raise AttributeError(f"'class_test' object has no attribute '{attr_name}'") super().__setattr__(attr_name, value)
这种方法适合需要动态调整允许属性的场景,但日常开发用__slots__更简洁高效,还能减少实例的内存占用。
内容的提问来源于stack exchange,提问作者huangjj
相关产品推荐
相关产品推荐

