Python lxml objectify不为自定义元素类调用构造函数

Python lxml objectify不为自定义元素类调用构造函数,python,constructor,lxml,objectify,Python,Constructor,Lxml,Objectify,lxml.objectify似乎没有调用自定义元素类的构造函数: from lxml import objectify, etree class CustomLookup(etree.CustomElementClassLookup): def lookup(self, node_type, document, namespace, name): lookupmap = { 'custom' : CustomElement } try:

lxml.objectify似乎没有调用自定义元素类的构造函数:

from lxml import objectify, etree

class CustomLookup(etree.CustomElementClassLookup):
    def lookup(self, node_type, document, namespace, name):
        lookupmap = { 'custom' : CustomElement }
        try:
            return lookupmap[name]
        except KeyError:
            return None

class CustomElement(etree.ElementBase):
    def __init__(self):
        print("Made CustomElement")

parser = objectify.makeparser()
parser.set_element_class_lookup(CustomLookup())
root = objectify.parse(fname,parser).getroot()
假设正在解析的文件是

<custom />
从:

元素初始化 有一件事需要事先知道。 元素类不能有
\uuuuu init\uuuuuuuuu
\uuuuu new\uuuuuuuuu
方法。不应该有任何内部状态 或者,但存储在中的数据除外 底层XML树。元素 实例被创建并丢弃 需要时收集,所以没有办法 预测代理的时间和频率 是为他们创建的。更糟糕的是,当 调用
\uuuu init\uuuu
方法 对象甚至还没有初始化 表示XML标记,因此没有 在提供
\uuuu init\uuuu
子类中的方法

大多数用例 不需要任何课程 初始化,因此您可以 跳到下一个 现在是第二节。然而,如果你 确实需要设置您的元素 在实例化时,有一个 可能的方法。元素基 类有一个
\u init()
方法 可以重写。它可以用来 修改XML树,例如构造 特殊子项或验证和更新 属性

\u init()的语义
详情如下:

  • 它是一次性的 元素类实例化时间。那个 是,当 该元素由lxml创建。在 此时,元素对象是 完全初始化以表示 树中的特定XML元素

  • 该方法可以完全访问 XML树。可以在中进行修改 和其他地方完全一样 在节目中

  • Python表示法 可以创建多个元素 XML生命周期内的时间 元素,该元素位于基础C树中。这个
    \u init()
    子类提供的代码本身必须特别注意 多次执行也可能是错误的 无害的,或它们被 XML树中的某种标志。这个 后者可以通过修改 属性值或通过删除或删除 添加特定的子节点,然后 在运行之前验证此选项 初始化过程

  • 有例外吗 将传播在
    \u init()
    中引发的 通过导致 创建元素。所以要小心 将您在此处编写的代码作为 例外情况可能会出现在各种情况下 意想不到的地方


谢谢,这正是我想要的。这一大堆话对我来说毫无意义。在实践中我应该做什么?我试图用
\uu init()
替换
\uu init(self)
,但仍然没有调用它。
\u init
不是
\uu init
:)
>>> isinstance(root,CustomElement)
True