Хранение "хлебных крошек" для объектных данных в Python

Я несколько раз сталкивался со следующим шаблоном при разработке приложений баз данных nosql на Python:

Я хочу динамически хранить ссылку на некоторые данные в иерархии объектов, что позволит мне получить доступ к данным и узнать, где они находятся в иерархии.

Например, предположим, у меня есть структура объекта, например:

class A(object):
    def __init__(self, val1, val2):
        self.val1 = val1
        self.val2 = val2

class B(object):
     def __init__(self, a):
          # a is an instance of A
          self.a = a

class C(object):
     def __init__(self, b):
          # b is an instance of B
          self.b = b

a = A(0,1)
b = B(a)
c = C(b)

Теперь я хочу обратиться (динамически) к некоторым данным, которые существуют глубоко внутри c объект.
Допустим, я хочу сослаться на val1 из A внутри B в c, То, что я делаю, - это создание кортежа ('b', 'a', 'val1') ссылаться на данные. Затем я сделаю любой класс, к которому я хочу обратиться, с помощью этих хлебных крошек, наследуемых от базового класса, скажем, Breadcrumb, который определяет методы для рекурсивного разбора крошки и использования getattr вернуть данные, к которым он относится.

Это шаблон? Анти-шаблон? Есть ли способ сделать это проще или изменить дизайн моей программы, чтобы мне не пришлось это делать?

1 ответ

Решение

Я не вижу особой пользы в том, чтобы быть навязчивым к тем классам, к которым вы обращаетесь (представление суперкласса считается навязчивым.) Почему они должны знать, к их атрибутам обращаются так или иначе? Они уже поддерживают getattr что все, что вам нужно для реализации этого.

Я бы просто написал бесплатную функцию iterative_getattr(obj, attrs) (возможно, с лучшим именем), который работает с любым объектом и обращается к цепочке атрибутов, определенных attrs кортеж.

Другие вопросы по тегам