Как правильно написать класс, который извлекает подклассы (методы) из нескольких файлов? - PullRequest
1 голос
/ 03 июня 2019

Я написал класс в качестве центрального механизма управления данными для карты регистров. Я написал подклассы (больше похоже на расширения), которые предоставляют различные входные парсеры и выходные форматеры. Однако они полагаются на возможность доступа к внутренним переменным основного класса для работы. Я хотел бы сохранить расширения отдельно от основного класса, но иметь возможность анонсировать все методы для экземпляра основного класса.

На самом деле все работает нормально, за исключением того, что я получаю много ошибок от Pylint вида: E: 275, 8: Экземпляр RegMapXLS не имеет члена log (нет члена) где log - это общая функция в основном классе.

# typical "extension" class
class RegMapXLS():
    ''' The part of RegisterMap class which contains the xlsx source file
        parsing functions
    '''

    def parse_config(self, configsheet):

# main class including all "extension class inherritance"
class RegisterMap(RegMapXLS, RegMapPy, RegMapDocx, RegMapVhdl):
    '''Register map bundling settings as instances of the class Setting.
    '''

    # only this class has an __init__ call to instantiate it and its code
    def __init__(self, name, output_path, report=None):

Конечно, я мог бы написать все это как один большой класс, но для удобства обслуживания я разделил их на несколько файлов. Другой способ - написать «базовый класс», который наследуют все «сестринские» классы, и создать пустой класс, который просто наследует все части (хотя тогда неясно, как я называю init метод 2 уровня вниз). Мой вопрос, что является лучшим / Pythonic способ и для обслуживания и читабельности.

В конце концов я хочу простой интерфейс, в котором я могу написать:

with RegisterMap(udi, output_path=output_path) as regmap:
    regmap.parse_source(regmap_source)

    #these methods are pulled in from other source files/authors
    regmap.export_HDF5(output_path)
    regmap.to_vhdl(regmap_reg_pkg_template)
    regmap.to_pin()
    regmap.to_docx(doc_template=doc_template)
...