Как использовать наследование для группировки атрибутов в Python? - PullRequest
0 голосов
/ 17 апреля 2020

Я начинаю с Python и хотел бы прочитать в XML -дереве и создать простой для работы объект python.

Это сегментация. XML Я прочитал, есть еще один, называемый Заголовок. XML Я бы добавил чтение в полных XML -файлах как объекты объективации (-> цель достигнута), но, как вы видите, мне нужно поработать над некоторыми значений, прежде чем я смогу их использовать (например, HSV-минимумы, которые должны быть словарями).

Сегментация. XML:

    <?xml version="1.0"?>
    <opencv_storage>
    <Segmentation>
      <Channels>3</Channels>
      <Depth>1</Depth>
      <Invert>1</Invert>
      <Remove-Border>0</Remove-Border>
      <Method>2</Method>
      <Input-is-RGB>1</Input-is-RGB>
      <HSV-Minima>
        100 0 50</HSV-Minima>
      <HSV-Maxima>
        130 255 255</HSV-Maxima></Segmentation>
    </opencv_storage>

У меня есть класс «классификатор», который наследует от «сегментации» и «заголовка». Предполагается, что эти два класса содержат атрибуты классификатора и хорошо их группируют, так что я могу получить к ним доступ с помощью

classifier.group.attribute

, например, например:

print(classy.segmentation.depth)

И это python код, который я до сих пор придумал:

    from lxml import objectify

    def str_to_hsv(input_string):
        """Converts an space-delimited string into an HSV-Dictionary"""
        hsv_string = str(input_string).strip()
        hsv_values = hsv_string.split(' ')
        hsv_dict = {}
        hsv_keys=['h', 's', 'v']
        for k in hsv_keys:
            hsv_dict[k] = hsv_values[hsv_keys.index(k)]
        return hsv_dict


    class segmentation():
        """A class that holds the Segmentation values"""

        def __init__(self, classifier_path, classifier_name):
            print("Init Segmentation")
            segmentation_tree = self.read_xml_tree(classifier_path, classifier_name, xml_filename='Segmenter.xml')
            self.Segmentation=segmentation
            self.Segmentation.channels = segmentation_tree.Segmentation.Channels
            self.Segmentation.depth = segmentation_tree.Segmentation.Depth
            self.Segmentation.invert = segmentation_tree.Segmentation.Invert
            self.Segmentation.remove_border = segmentation_tree.Segmentation['Remove-Border']
            self.Segmentation.method = segmentation_tree.Segmentation.Method
            self.Segmentation.input_is_rgb = segmentation_tree.Segmentation['Input-is-RGB']
            self.Segmentation.hsv_minima = str_to_hsv(str(segmentation_tree.Segmentation['HSV-Minima']).strip())
            self.Segmentation.hsv_maxima = str_to_hsv(str(segmentation_tree.Segmentation['HSV-Maxima']).strip())

    class header():
        """ A class that holds the Header values"""

        def __init__(self, classifier_path, classifier_name):
            print("Init Header")
            self.header=header

    class classifier(header, segmentation):
        """ A class representing a Falco classifier"""

        def __init__(self, classifier_path, classifier_name):
            self.path=classifier_path
            self.name=classifier_name
            header.__init__(self, classifier_path, classifier_name)
            segmentation.__init__(self, classifier_path, classifier_name)


        def read_xml_tree(self, classifier_path, classifier_name, xml_filename):
            """Reads in a XML File and returns its tree as an object"""
            filepath = classifier_path + '\\' + classifier_name + xml_filename
            with open(filepath) as f:
                xml = f.read()
            tree = objectify.fromstring(xml)
            return tree

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

classifier.attribut

Кроме того, я не думаю, что строка

self.Segmentation=segmentation

в init класса сегментации очень элегантен.

Можете ли вы указать мне правильное направление, пожалуйста?

Спасибо!

...