Python3: Как улучшить сложную иерархию классов для лучшего доступа к некоторым объектам, закопанным там? - PullRequest
0 голосов
/ 24 октября 2018

У меня сложная иерархия классов, в которой классы похожи друг на друга, но каждый класс содержит набор более или менее сложных переменных с состоянием.Чтобы произвести впечатление, взгляните на этот минимальный рабочий пример:

class OptVar:
    """
    Complicated stateful variable
    """
    def __init__(self, **kwargs):
        self.parameters = kwargs


class OptVarContainer:
    """
    Class which contains several OptVar objects and nested OptVarContainer
    classes. Is responsible for OptVar management of its sub-OptVarContainers
    with their respective OptVar objects.
    """
    def __init__(self, **kwargs):
        for (key, value_dict) in kwargs.items():
            setattr(self, key, OptVar(**value_dict))


class C(OptVarContainer):
    """
    Specific implementation of class OptVarContainer
    """
    def __init__(self):
        super(C, self).__init__(
                **{"my_c_a": {"c1": 1, "c2": 2},
                   "my_c_b": {"c3": 3, "c4": 4}})


class B(OptVarContainer):
    """
    Specific implementation of class OptVarContainer
    """
    def __init__(self):
        super(B, self).__init__(**{"b": {"1": 1, "2": 2}})
        self.c_obj = C()


class A(OptVarContainer):
    """
    Specific implementation of class OptVarContainer
    """
    def __init__(self):
        super(A, self).__init__(
                **{"a1": {"1": 1, "2": 2},
                   "a2": {"a": "a", "b": "b"}})
        self.b_obj = B()


def main():
    # creating OptVarContainer with some nested OptVarContainers.
    my_a_obj = A()
    # It is intended behaviour to access the OptVar objects via
    # scoping within the class hierarchy.
    print(my_a_obj.b_obj.b.parameters)
    my_a_obj.b_obj.b.parameters["2"] = 3
    print(my_a_obj.b_obj.b.parameters)
    print(my_a_obj.b_obj.c_obj.my_c_a.parameters["c1"])
    my_a_obj.b_obj.c_obj.my_c_a.parameters["c1"] = 6
    print(my_a_obj.b_obj.c_obj.my_c_a.parameters)
    # Two major problems:
    # a) Serialization (with compatibility between different versions)
    # b) Access to all OptVar objects at once


if __name__ == "__main__":
    main()

Теперь возникает вопрос: как лучше всего получить доступ к объектам OptVar.Я уже думал о том, чтобы использовать какой-то объект пула и использовать некоторый прокси в иерархии классов, чтобы иметь ссылку на пул.Этот пул не должен быть одноэлементным, поскольку должна быть возможность управлять более чем одним пулом одновременно.До настоящего времени доступ к переменным OptVar в моем собственном коде осуществлялся посредством некоторой черной магии Python и рекурсивным обходом классов, избегая бесконечных циклов путем поддержания списка идентификаторов.Это довольно некрасиво и считается только временным.

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

Полный контекст этого вопроса здесь но после некоторых обсуждений я отделил часть дизайна.

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