Как работает self в объектно-ориентированном программировании на Python - PullRequest
0 голосов
/ 07 мая 2019

Я работаю над созданием образца XML из подмножества файла схемы XSD.Я сгенерировал объекты данных, используя GenerateDS.Я создал родительский объект и использую рекурсию с отражением, чтобы заполнить все дочерние объекты, чтобы я мог записать XML этого родительского объекта и всех его дочерних объектов.Позже я хочу заполнить все атрибуты данных тестовыми данными для создания моего тестового XML.

У меня проблема с кодом GenerateDS, сгенерированным из моего XSD.Я не уверен, что это мое непонимание объектно-ориентированного программирования на 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 в экспорте заголовкаМетод принимает значение уровня.

Сигнатура метода экспорта заголовка: export(self, outfile, level, namespaceprefix_='', namespacedef_='', name_='Header', pretty_print=True):

Я создал классы в Python и раньше, и когда я вызывал методы класса, аргумент self пропускался ипервый аргумент, который я передаю в вызов метода, будет следующим после параметра self.Однако в этом случае вызов метода перезаписывает себя с помощью outfile, и мой объект Header становится объектом File.Это странно, и я не понимаю, почему это произошло.

Я запускал его на Anaconda с Python 3.6 в моем отладчике кода Visual Studio.

Вот код, который я создал.

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но на самом деле он присваивает значение себе, он перезаписывает его объектом File.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...