Вопрос о множественном наследовании, создании и создании класса Dynami c - PullRequest
1 голос
/ 18 февраля 2020

Здравствуйте, у меня следующая ситуация:

  • Специализированный класс, который наследуется от двух родительских классов
  • Необходимость определения наиболее специализированного класса во время выполнения на основе некоторой информации что я получаю только тогда, когда начинаю читать данные из базы данных.

Я определил следующий код для обработки создания всех классов в цепочке:

class BusinessDocument():
    @staticmethod
    def get_class(doc_type):
        switch = {
            'MasterData': MasterData,
            'Transactional': Transactional
        }
        func = switch.get(doc_type, lambda: "Invalid Noun Type")
        return func()

    def __init__(self, doc_id, location, doc_type):
        self.doc_id = doc_id
        self.location = location
        self.doc_type = doc_type
        pass

    @property
    def get_location(self):
        return self.location

    @property
    def get_doc_id(self):
        return self.doc_id

class MasterData(BusinessDocument):
    def __init__(self, doc_id, location):
        BusinessDocument.__init__(self, doc_id, location, 'MasterData')

class Transactional(BusinessDocument):
    def __init__(self, doc_id, location):
        BusinessDocument.__init__(self, doc_id, location, 'Transactional')


class NounClass():
    @staticmethod
    def get_class(doc_name, doc_type):
        return type(doc_name, (BusinessDocument.get_class(doc_type), 
                           BusinessDocument, ),dict.fromkeys(['doc_id', 'location'])) 

Затем во время выполнения, когда я получаю doc_name и пытаюсь создать новый учебный класс. На данный момент у меня могут не быть обязательных аргументов doc_id и location , но мне нужно ввести тип.

invoice_cls = NounClass.get_class('Invoice', 'Transactional')

Я получаю следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-cb774746875a> in <module>
----> 1 invoice_cls = NounClass.get_class('Invoice', 'Transactional')

<ipython-input-9-aa5e0b316ed1> in get_class(doc_name, doc_type)
     35     @staticmethod
     36     def get_class(doc_name, doc_type):
---> 37         return type(doc_name, (BusinessDocument.get_class(doc_type), 
     38                            BusinessDocument, ),dict.fromkeys(['doc_id', 'location']))

<ipython-input-9-aa5e0b316ed1> in get_class(doc_type)
      7         }
      8         func = switch.get(doc_type, lambda: "Invalid Noun Type")
----> 9         return func()
     10 
     11     def __init__(self, doc_id, location, doc_type):

TypeError: __init__() missing 2 required positional arguments: 'doc_id' and 'location'

Я понимаю, что причина этого в том, что __init __ () будет вызываться во время создания экземпляра класса, но я думал, что тип будет только создавать новый тип, а не создавать его сразу. Поэтому мой вопрос заключается в том, есть ли способ отложить создание экземпляра в данный момент.

Заранее благодарю за любую помощь и советы по этому вопросу.

- MD.

1 Ответ

1 голос
/ 18 февраля 2020

Инициализация происходит в строке 9:

    return func()

Я предполагаю, что вы хотите вернуть объект класса, поэтому удалите эти паратезы.

Также fun c вводит в заблуждение, я изменил его на cls :

def get_class(doc_type):
    switch = {
        'MasterData': MasterData,
        'Transactional': Transactional
    }
    cls = switch.get(doc_type, lambda: "Invalid Noun Type")
    return cls
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...