【发布时间】:2015-05-16 17:14:35
【问题描述】:
我正在尝试在 python 的 xml.etree.ElementTree 中为 ElementTree 和 Element 创建一个小插件,这将允许如下符号:
root = ET.fromstring('<root><a><b attr1="2"/></a></root>')
element1 = root.a
element2 = root.a.b
attr = root.a.b.attr
我试过了:
import xml.etree.ElementTree as _ET
def __getattr__(self, key):
return self.find('./' + key)
class ElementTree(_ET.ElementTree):
__getattr__ = __getattr__
class Element(_ET.Element):
__getattr__ = __getattr__
但这不起作用,因为ET.parse、ET.fromstring、ET.ElementTree.find 等将始终返回内部Element 和ElementTree 对象。
Monkeypatching 类也不起作用:
>>> xml.etree.ElementTree.Element.__getattr__ = lambda x: x
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-bacb0a64c2e5> in <module>()
----> 1 xml.etree.ElementTree.Element.__getattr__ = lambda x: x
TypeError: can't set attributes of built-in/extension type 'xml.etree.ElementTree.Element'
不复制python etree模块然后添加__getattr__是否可行?
【问题讨论】: