真的很奇怪......无法设置内置/扩展类型的属性' lxml.etree._Element'

时间:2017-08-19 16:27:52

标签: python mocking lxml monkeypatching

我之前没有问题就改变了其他类的属性。 _Element显然不是内置的。

from lxml.etree import _Element
_Element.new_attr = 54

结果:

TypeError:无法设置内置/扩展类型的属性' lxml.etree._Element'

2 个答案:

答案 0 :(得分:0)

'(\s*)(.*?)(\s*)'implemented in Cython。作为Steve Holden explains(我的重点),

  

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

和Guido van Rossum解释了为什么this is by-design

  

这是故意禁止意外致命的变化   内置类型(致命的部分代码,你从来没有   的)。此外,它是为了防止更改影响不同   自内置类型以来驻留在地址空间中的解释器   (与用户定义的类不同)在所有这些之间共享   解释器。

答案 1 :(得分:0)

_Element类来自Cython编译的二进制模块。这些不是Python第一公民对象,您不能向这些对象添加任意属性。