保持';面包屑';在Python中创建对象数据

保持';面包屑';在Python中创建对象数据,python,reference,breadcrumbs,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

在用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
对象中深层存在的一些数据。
假设我想引用
c
B
A
val1
。我正在做的是创建一个“面包屑”元组
(“b”、“a”、“val1”)
,以引用数据。然后,我将使我想用这些面包屑引用的任何类从基类继承,比如说
Breadcrumb
,它定义递归解析面包屑的方法,并使用
getattr
返回它引用的数据


这是一种模式吗?反模式?有没有更简单的方法来实现这一点,或者重新设计我的程序,这样我就不必这么做了?

我看不出侵入您访问的类有什么好处(引入超类被视为侵入)。为什么他们需要知道他们的属性是以这种方式还是那种方式访问的?它们已经支持
getattr
,这就是实现此功能所需的全部功能


我只需要编写一个免费函数
iterative_getattr(obj,attrs)
(可能有更好的名称),它可以在任何对象上工作,并访问由
attrs
元组定义的属性链。

感谢您思考我的问题。我本应该写这个问题,但我还想做更复杂的事情,比如访问对象中的变量,这些变量存储在其他对象的列表中,因此访问属性的方法很重要。@mskel我仍然会尝试使其不具侵扰性。可能会使
迭代_getattr
函数和访问描述符复杂化(用更复杂的内容替换attr名称的普通列表),但尽量不要在访问的类中实现访问逻辑。然后你会得到一个在任何类上都可以免费使用的机制。