3

在 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
假设我想引用in里面的val1of 。我正在做的是制作一个“面包屑”元组来引用数据。然后,我将使用这些面包屑引用的任何类都继承自基类 say ,该基类定义了递归解析面包屑并用于返回它所引用的数据的方法。ABc('b', 'a', 'val1')Breadcrumbgetattr

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

4

1 回答 1

1

我认为侵入您访问的类没有多大好处(引入超类算作侵入)。为什么他们需要知道他们的属性是以这种方式访问​​还是以那种方式访问​​?他们已经支持getattr实现这一点所需的一切。

我只想写一个自由函数iterative_getattr(obj, attrs)(也许有更好的名字),它适用于任何对象并访问attrs元组定义的属性链。

于 2012-10-10T12:27:20.460 回答