函数对象支持任意属性的原因是,在我们添加该功能之前,有几个框架(例如,解析器生成器框架)正在滥用函数文档字符串(以及函数对象的其他属性),以隐藏对它们至关重要的每个函数的信息- 显而易见,通过示例证明了将任意命名属性与功能对象进行这种关联的需要,即直接用语言支持它们,而不是用粗俗的方式(例如,滥用文档字符串)来支持它们,这是显而易见的。
为了支持任意实例属性,类型必须为它的每个实例提供一个__dict__
-对于函数(无论如何都不是小对象)来说没什么大不了的,但是对于其他 打算 是小对象的对象来说,则可能不大。通过使object
类型尽可能轻,并__slots__
尽可能避免__dict__
在的子类型中出现每个实例object
,我们竭尽所能地支持小型的专用“值”类型。