self如何在Python的面向对象编程中工作?

时间:2019-05-07 14:12:42

标签: python xml oop xsd

我正在根据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对象覆盖。

0 个答案:

没有答案