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更新链接