__slots__不会在条件判断后丢失内容,所谓“丢失”实为继承中子类未显式定义__slots__导致__dict__被创建、父类约束失效,或子类__slots__未包含父类槽名致使属性不可访问,本质是声明缺失或初始化遗漏。

__slots__ 本身不会“在条件判断后丢失内容”——它不是运行时变量,而是类定义时的静态声明。你看到的“内容丢失”,实际是属性访问失败或对象状态异常,根源几乎都出在继承关系或实例初始化阶段,而非条件语句本身。
为什么 if/else 里读不到 __slots__ 属性?
这不是 __slots__ 的问题,而是你试图访问一个根本没被赋值的属性:
- 属性名拼写错误(比如
self.nam而非self.name),触发AttributeError - 条件分支中漏写了赋值:只在
if分支设置了self.status,但else分支没设,后续代码却直接读取self.status - 父类
__slots__没被子类正确继承,导致子类实例无法存储父类声明的字段(例如父类有__slots__ = ['id'],子类没定义__slots__或漏写'id')
__slots__ 在继承中“消失”的真实原因
所谓“丢失”,本质是子类未显式声明 __slots__,导致 Python 自动为其创建 __dict__,而父类的 __slots__ 约束失效:
- 父类定义了
__slots__ = ['name'],子类没定义__slots__→ 子类实例有__dict__,可动态加属性,但父类约束形同虚设 - 子类定义了
__slots__ = ['age'],但没包含父类的'name'→ 实例能存age,但无法存/读name,哪怕父类__init__已赋值 - 多重继承中两个父类都有非空
__slots__→ 直接报TypeError: multiple bases have non-empty __slots__,类根本创建不了
调试时看到 AttributeError 却怀疑条件判断?
常见误判场景:
- 你在
if块里给self.flag赋值,但条件为False,于是该属性从未被创建 → 后续任何地方读self.flag都会崩 - 用了
__slots__却忘了在__init__中显式初始化所有槽位(比如漏调super().__init__()),导致部分字段始终为空 - 用
getattr(obj, 'x', None)读属性,结果返回None,误以为“内容丢失”,其实是压根没赋过值
真正要盯住的不是条件语句,而是:每个 __slots__ 列表是否覆盖了所有需存取的字段、每个继承层级是否显式声明、每个实例初始化路径是否确保所有槽位都被赋值。漏掉任意一环,都会表现为“突然读不到”。











