繁体   English   中英

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

[英]Really weird… can't set attributes of built-in/extension type 'lxml.etree._Element'

我之前已经更改了其他类的属性,没有问题。 _Element 显然不是内置的。

from lxml.etree import _Element
_Element.new_attr = 54

结果:

类型错误:无法设置内置/扩展类型“lxml.etree._Element”的属性

_Element 在 Cython 中实现 正如史蒂夫霍尔登解释的那样(我的重点),

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

和 Guido van Rossum 解释了为什么这是故意的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM