Как мне получить доступ и использовать данные из класса, который хранится в инициализации другого класса? (Python) - PullRequest
1 голос
/ 16 марта 2020

Привет и спасибо, что прочитали это. В данный момент я работаю над своим заданием для прохождения практики. Мое задание выполнено в Python, и я должен использовать объектно-ориентированное программирование, но это не совсем моя сильная сторона. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что у меня есть несколько классов с различными типами данных, но я не могу получить доступ к определенным данным, которые мне нужно использовать. Посмотрите ниже на часть кода, который я сделал до сих пор.



    class Field:
        def __init__(self, name, address, field_type, repeat="    ", field_size="[31:0]", data=None):
            if field_type is not "R" and field_type is not "W" and field_type is not "RMW":
                print("Error: field type is invalid")
            else:
                self.name = name
                self.address = address
                self.field_type = field_type
                self.repeat = repeat
                self.field_size = field_size
                self.data = data

        def show(self):
            print("%-10s %-10s %-10s %-10s %-10s" % (
                self.name, self.field_size, hex(self.address), self.repeat, self.field_type))

    class Regmap:
        def __init__(self, name, address, repeat=""):
            self.name = name
            self.address = address
            self.repeat = repeat


    class TestRegmap1(Regmap):
        def __init__(self, name, address, repeat=""):
            super().__init__(name, address, repeat)
            self.field1 = Field("veld1", 0x00, "RMW", "4s4"),
            self.field2 = Field("veld2", 0x80, "RMW", "64s64"),
            self.field3 = Field("veld3", 0xc0, "RMW"),
            self.field4 = Field("veld4", 0xD0, "W"),
            self.field5 = Field("veld5", 0xE0, "RMW")


    regmap1 = TestRegmap1("regmap1", 0x00)

Данные внутри класса "testregmap1" - это пример кода, который будет сгенерирован. Я ничего не могу с этим изменить.

Внутри моего родительского класса "regmap" я пытаюсь создать функцию, которая будет печатать все мои разные поля, созданные в классе "testregmap1". Я хочу, чтобы функция все еще работала, даже если внутри класса "testregmap1" больше или меньше данных. Я чувствую, что не знаю достаточно о OOP и Python, чтобы понять это, и я не так много могу найти об этой конкретной проблеме c.

Если у вас есть какая-либо информация, которая может помочь пожалуйста, дайте мне знать. Заранее спасибо.

1 Ответ

0 голосов
/ 16 марта 2020

, вероятно, есть еще много подходов к этому, но я бы выбрал один из них:

  1. Создайте функцию, которая вызывает NotImplementedError, затем реализуйте в новом классе
  2. ИЛИ используйте список или словарь для полей

Метод 1:

class Regmap:
    def __init__(self, name, address, repeat=""):
        self.name = name
        self.address = address
        self.repeat = repeat

    def printFields(self):
        raise NotImplementedError()

class TestRegmap1(Regmap):
    def __init__(self, name, address, repeat=""):
        super().__init__(name, address, repeat)
        self.field1 = Field("veld1", 0x00, "RMW", "4s4")
        self.field2 = Field("veld2", 0x80, "RMW", "64s64")
        self.field3 = Field("veld3", 0xc0, "RMW")
        self.field4 = Field("veld4", 0xD0, "W")
        self.field5 = Field("veld5", 0xE0, "RMW")

    def printFields(self): # note: same function, different code
        print(
            self.field1,
            self.field2,
            self.field3,
            self.field4,
        )

определение функции с тем же именем в дочернем классе в python перезаписывает функцию.

метод 2:

class Regmap:
    def __init__(self, name, address, repeat=""):
        self.name = name
        self.address = address
        self.repeat = repeat
        self.fields = []

    def printFields(self):
        for field in self.fields:
            field.show()

class TestRegmap1(Regmap):
    def __init__(self, name, address, repeat=""):
        super().__init__(name, address, repeat)
        self.fields = [
            Field("veld1", 0x00, "RMW", "4s4"),
            Field("veld2", 0x80, "RMW", "64s64"),
            Field("veld3", 0xc0, "RMW"),
            Field("veld4", 0xD0, "W"),
            Field("veld5", 0xE0, "RMW")
        ]


regmap1 = TestRegmap1("regmap1", 0x00)

regmap1.printFields()

Надеюсь, это поможет:)

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