作者:龙龙玖号_367 | 来源:互联网 | 2023-09-18 20:57
我需要加载,处理然后写回各种不同文件格式的各种对象。每种文件格式的结构都不同,但是我正在尝试创建具有预期属性和行为的单个基类,然后继承将这些预期属性映射到我需要使用的各种数据格式的子类。
使用简单的类似表的数据结构很容易做到,我可以使用查找表将其映射到字典,但是目前,我正在使用嵌套的XML文件结构,我的问题是,是否有一种有效的方法?我将期望的树形结构映射到现有对象属性的方法?目前,我正在使用@property描述符,该描述符可以正常工作,但会感到不必要的繁琐。
import xml.etree.ElementTree as ET
class XMLEvent(parentclass):
wraps_type = ET.Element
default_data = []
def __init__(self,data=None,**kwargs):
"""init method is actually inherited from baseclass,but showing here."""
self.parent = None
if data is not None:
assert isinstance(data,self.wraps_type)
self.data = data
else:
self.data = self.wraps_type(*self.default_data)
@property
def event_num(self):
# Num is an attribute on the base element
return self.data.attrib['Num']
@event_num.setter
def event_num(self,val):
self.data.attrib['Num'] = str(val)
@property
def clip_name(self):
# ClipName is an element nested under the Source element,so
# we find the Source element,then look for a ClipName element,# then try to grab its 'text' attribute.
return getattr(self._source.find('ClipName'),'text',None)
@clip_name.setter
def clip_name(self,val):
clip_name = self._source.find('ClipName')
# if no ClipName element exists,we have to create one. The
# _source property getter method does a similar 'get or create'
if clip_name is None:
clip_name = ET.SubElement(self._source,'ClipName')
setattr(clip_name,val)
... etc ...
我知道我可以将这些“如果子元素不存在,创建它”行折叠成一个单一的方法,但是我想知道是否还有一种更合适的方法可以将我保存在样板上。我的直觉告诉我,如果可能的话,我希望实际上可以在对象的字典中显示属性的东西,而不只是加载getattr()方法,但这也许对我来说不是很Python。
我正在使用Python 3.7。
谢谢!