Python 真奇怪。。。无法设置内置/扩展类型“lxml.etree.\u元素”的属性

Python 真奇怪。。。无法设置内置/扩展类型“lxml.etree.\u元素”的属性,python,mocking,lxml,monkeypatching,Python,Mocking,Lxml,Monkeypatching,我以前更改过其他类的属性,没有任何问题_元素显然不是内置的 from lxml.etree import _Element _Element.new_attr = 54 结果: TypeError:无法设置内置/扩展类型“lxml.etree.\u元素”的属性。作为我的重点 问题是扩展类型的属性是由 对象插槽的布局并永久固定在C代码中 实现它们:插槽无法扩展,因此无法添加 属性。这是一个效率特性:速度会非常慢 要使用后期绑定查找基本类型的属性,还需要 稍微改变语言的性质,使其更像Ruby或 自

我以前更改过其他类的属性,没有任何问题_元素显然不是内置的

from lxml.etree import _Element
_Element.new_attr = 54
结果:

TypeError:无法设置内置/扩展类型“lxml.etree.\u元素”的属性。作为我的重点

问题是扩展类型的属性是由 对象插槽的布局并永久固定在C代码中 实现它们:插槽无法扩展,因此无法添加 属性。这是一个效率特性:速度会非常慢 要使用后期绑定查找基本类型的属性,还需要 稍微改变语言的性质,使其更像Ruby或 自我

Guido van Rossum解释了原因:

这是故意禁止的,以防止意外的致命变化 内置类型对您从未想过的代码部分是致命的 属于此外,这样做是为了防止更改影响不同的应用程序 驻留在地址空间中的解释器,因为内置类型 与用户定义的类不同,用户定义的类在所有这些类之间共享 口译员


_元素类来自Cython编译的二进制模块。这些不是Python 1st citizen对象,您不能向这些对象添加任意属性。

如果我使用禁止水果作为解决方法,效果很好。仍然很好奇为什么这是必要的Guido van Rossum更新链接