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



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

from lxml.etree import _Element
_Element.new_attr = 54

结果在:

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

_Element

在Cython中实现。正如史蒂夫·霍尔顿(Steve Holden(所解释的那样(我的强调(,

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

Guido van Rossum解释了为什么这是设计使然:

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

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

最新更新