我正在根据XSD模式文件的子集生成示例XML。我已经使用GenerateDS生成了数据对象。我实例化了父对象,并使用带有反射的递归来填充所有子对象,因此我可以写出该父对象及其所有子对象的XML。稍后,我想用测试数据填充所有数据属性以创建我的测试XML。
我的XSD生成的GenerateGene代码存在问题。我不确定这是否是我对Python中的面向对象编程缺乏了解,还是该库存在问题,也许有人可以帮助我。
这是问题。当我运行导出方法时,它将执行
self.exportChildren(outfile, level + 1, '', namespacedef_, name_='requestHeaderType', pretty_print=pretty_print)
并将文件对象传递到外文件中,级别为0 + 1
,但是问题在于,当exportChildren执行时,这是参数,
self.Header.export(outfile, level, namespaceprefix_, namespacedef_='', name_='Header', pretty_print=pretty_print)
标头导出方法中的参数outfile取值为level。
标头导出的方法签名为export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='Header', pretty_print=True):
在调用类方法之前和之后,我已经在Python中创建了类,而self参数将被跳过,而传递给方法调用的第一个参数将是self参数之后的下一个参数。但是,在这种情况下,方法调用将用outfile覆盖self,而我的Header对象将成为File对象。这很奇怪,我不明白为什么会这样。
我已经在Visual Studio Code调试器中使用Python 3.6在Anaconda上运行它。
这是我创建的代码。
import po3
def get_class( kls ):
parts = kls.split('.')
module = ".".join(parts[:-1])
m = __import__( module )
for comp in parts[1:]:
m = getattr(m, comp)
return m
def recursiveInstantiation(obj):
for key in vars(obj).keys():
if '_' not in key and \
'subclass' not in key and \
'superclass' not in key and \
'factory' not in key and \
'export' not in key and \
'build' not in key:
subClass = recursiveInstantiation(get_class('po3.' + key))
getattr(obj, 'set_' + key)(subClass)
return obj
er = recursiveInstantiation(po3.EstablishRequest())
print(er.get_requestHeaderType()) # returns requestHeaderType object
print(er.get_requestHeaderType().get_Header()) # returns an exception posted below
#with open('file.xml', 'w') as outfile:
# er.export(outfile, 0) # calling this produces the behavior I described above
这是我运行此脚本时的输出:
<class 'po3.requestHeaderType'>
Traceback (most recent call last):
File "c:\Users\arychlik\Desktop\New folder (3)\generateXml.py", line 26, in <module>
print(er.get_requestHeaderType().get_Header())
TypeError: get_Header() missing 1 required positional argument: 'self'
我希望方法调用会跳过self参数,但实际上是为self赋了一个值,它正在用File对象覆盖。