У меня сложная иерархия классов, в которой классы похожи друг на друга, но каждый класс содержит набор более или менее сложных переменных с состоянием.Чтобы произвести впечатление, взгляните на этот минимальный рабочий пример:
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 и рекурсивным обходом классов, избегая бесконечных циклов путем поддержания списка идентификаторов.Это довольно некрасиво и считается только временным.
Я знаю, что для этой проблемы проектирования не существует уникальных решений, но мне нужно получить дополнительную информацию по этому вопросу от вас.
Полный контекст этого вопроса здесь но после некоторых обсуждений я отделил часть дизайна.