在Python中保持“面包屑”对象数据

时间:2012-10-10 01:01:39

标签: python reference breadcrumbs

在Python中设计nosql数据库应用程序时,我遇到了以下几种模式:

我想要的是动态存储对象层次结构中某些数据的引用,这样我就可以访问数据并知道它在层次结构中的位置。

例如,假设我有一个对象结构,如:

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对象内部的一些数据 假设我想引用val1AB的{​​{1}}。我正在做的是制作一个'breadcrumb'元组c来引用数据。然后,我将使用这些面包屑来引用我想要引用的任何类继承自基类class ('b', 'a', 'val1'),它定义了递归地解析面包屑并使用Breadcrumb返回数据的方法是指。

这是一种模式吗?反模式?有没有办法更简单地做到这一点,或重新设计我的程序,所以我没有?

1 个答案:

答案 0 :(得分:1)

我没有看到对您访问的类进行干扰有多大好处(引入超类计数作为侵入性。)为什么他们需要知道他们的属性是以这种方式还是以这种方式访问​​?他们已经支持getattr,这就是实现这一目标所需的全部内容。

我只想编写一个自由函数iterative_getattr(obj, attrs)(可能有更好的名称),它可以处理任何对象并访问由attrs元组定义的属性链。