Python类复用的内部变量清理及pylint报错处理方案咨询
问题根因与修复方案
报错原因
- E1102
self.clear is not callable:你的类中存在self.clear的属性赋值操作,覆盖了原本的clear方法,导致调用时检测到非可调用对象。 - W0201
Attribute defined outside __init__:pylint要求所有实例属性必须在构造函数__init__中完成初始化声明,你当前的_id、_name等属性是在clear方法中第一次赋值,不符合规范。
正确实现代码
把清理方法改名避免命名冲突,同时在__init__中初始化所有属性即可:
class YourClass: def __init__(self): # 初始化所有实例属性,解决W0201报错 self._id = "" self._name = "" self._elbclient = "" self._elbname = "" @property def id(self): return self._id @id.setter def id(self, arg): '''Set the id to a value, clearing other settings''' self.reset_state(except_id=arg) @property def name(self): return self._name @name.setter def name(self, arg): '''Set the name to a value, clearing other settings''' self.reset_state(except_name=arg) # 方法改名避免和clear属性冲突,解决E1102报错 def reset_state(self, except_id="", except_name=""): self._id = except_id self._name = except_name self._elbclient = "" self._elbname = ""
复用实例 vs 重新实例化选择标准
- 选择复用实例的场景:
- 类初始化成本高,比如初始化时需要建立网络连接、拉取大量公共配置,重建实例开销大
- 外部有多处引用该实例,替换实例需要同步更新所有引用,维护成本高
- 实例存在除
id/name关联属性外的其他需要保留的状态
- 选择重新实例化的场景:
- 类初始化成本极低,无额外IO或计算开销
- 后续需要重置的属性会持续增加,维护
reset_state方法容易出现漏清属性的bug,重新实例化可以一次性重置所有状态,更可靠 - 新的
id/name对应完全独立的业务对象,不需要保留原有实例的任何状态
内容的提问来源于stack exchange,提问作者shepster
相关产品推荐
相关产品推荐

