我不明白为什么在
Python 3中我无法向ElementTree.Element实例添加一些属性.这是区别:
在Python 2中:
Python 2.6.6 (r266:84292, Jun 18 2012, 14:18:47)
[GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
50
>>>
在Python 3中:
Python 3.3.0 (default, Sep 11 2013, 16:29:08)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.etree import ElementTree as ET
>>> el = ET.Element('table')
>>> el.foo = 50
>>> el.foo
AttributeError: foo
>>>
Python 2由发行版(CentOS)提供. Python 3是从源代码编译而来的.
它是预期的行为,一个错误,还是我必须用一些额外的标志重新编译python 3?
更新:
一些澄清:我试图在Python对象上设置属性,即在Element实例上.不是XML属性(Element.attrib).
当我尝试继承Element时,这个问题实际上就出现了.这是一个例子:
>>> class Table(ET.Element):
... def __init__(self):
... super().__init__('table')
... print('calling __init__')
... self.foo = 50
...
>>> t = Table()
calling __init__
>>> t.foo
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'Table' object has no attribute 'foo'
>>>
这让我觉得Element类是以某种棘手的方式实例化的,但我无法弄清楚发生了什么.因此问题.
最佳答案 这可能是有意的……看看
Can’t set attributes of object class.如果他们没有增强ElementTree在那段时间使用插槽而不是dict,我会感到惊讶.
不清楚你要做什么……你真的想设置python属性或XML属性吗?如果是后者,你真的想这样做:
el = ET.Element('table')
el.set('foo', 50)
#or
el.attrib['foo'] = 50
如果你真的想要添加python属性,你应该改为子类,并且可能提供你自己的Element / SubElement函数来提供’wrapped’元素而不是标准元素.
2016年6月4日更新:也许我的回答并不清楚,但这是你可能需要做的事情(我通常是python 2.7):
class Table(ET.Element):
# Adding __slots__ gives it a known attribute to use
__slots__ = ('foo',)
def __init__(self):
super().__init__('table')
print('calling __init__')
self.foo = 50