声明私有实例变量__init__. None



是否应该在init中声明类的私有实例变量?函数?我的代码在没有这样做的情况下工作得很好,但是PyCharm告诉我在突出显示警告时这样做。

__init__中,将所有实例变量赋值给通常被认为是一种良好的做法,即使它们中的一些被惰性地给定了实际值,而在__init__中,你所能做的就是给它们一个哨兵,表示"这里还没有值";(如None)。这有两个原因:

  1. 维护人员的好处:如果您不遵循此指导原则,那么确定类可能具有的完整属性集需要读取整个类以查找惰性添加的属性。如果维护人员可以指望__init__提供完整的属性集,即使其中一些属性在其他地方给出了实际值,也会容易得多。
  2. (在现代CPython上,作为实现细节)减少内存使用:当一个类的所有实例以相同的顺序被赋予相同的属性集时,并且属性集在__init__之后不会被不可预测地修改(可以重新分配属性,只是不添加或删除属性),CPython使用一个键共享字典来保存每个实例的属性。存储键的哈希表本身最终是共享的,绑定到类本身,只有包含实例属性值的廉价数组最终消耗内存。对于具有单个属性的类,这将使每个实例的__dict__大小从232字节减少到104字节,并且随着属性数量的增加,该比率保持相似(密钥共享__dict__比非密钥共享__dict__消耗的内存少一半)。

最新更新