Я написал класс в качестве центрального механизма управления данными для карты регистров. Я написал подклассы (больше похоже на расширения), которые предоставляют различные входные парсеры и выходные форматеры. Однако они полагаются на возможность доступа к внутренним переменным основного класса для работы. Я хотел бы сохранить расширения отдельно от основного класса, но иметь возможность анонсировать все методы для экземпляра основного класса.
На самом деле все работает нормально, за исключением того, что я получаю много ошибок от 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)