Если вы хотите иметь довольно обычные, но настраиваемые объекты, которые находятся в иерархии, но могут преобразовываться в иерархию типов python (целые числа, строки, списки и словесные выражения), то вы должны договориться, что они вызывают out_dict()
рекурсивно для вас.
Попробуйте это:
from random import randint
class OutDict:
def out_dict(self):
out = {}
for k,v in self.__dict__.items():
if hasattr(v,'out_dict'):
print('out_dict')
out[k] = v.out_dict()
elif isinstance(v,list):
out[k] = self.out_list(v)
else:
out[k] = v
return out
def out_list(self, values):
return [v.out_dict() if hasattr(v,'out_dict') else v for v in values]
class A(OutDict):
def __init__(self, a, b):
self.a = a
self.b = b
class B(OutDict):
def __init__(self, B_a, list_of_A):
self.b_arg = B_a
self.list_of_A = list_of_A
class C(OutDict):
def __init__(self, C_a, list_of_B):
self.c_arg = C_a
self.list_of_B = list_of_B
list_of_A = [A(randint(0,100), randint(0,100)) for _ in range(5)]
list_of_B = [B(5, list_of_A) for _ in range(3)]
c = C(10, list_of_B)
print(c.out_dict())
Обратите внимание, как я создал пользовательский базовый класс OutDict
, который имеет метод out_dict()
(и вспомогательный * 1009). * method) какие классы A
, B
и C
получены из.
Пример выходных данных:
{'c_arg': 10, 'list_of_B': [{'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}, {'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}, {'b_arg': 5, 'list_of_A': [{'a': 100, 'b': 93}, {'a': 82, 'b': 52}, {'a': 39, 'b': 63}, {'a': 24, 'b': 94}, {'a': 40, 'b': 95}]}]}