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内のof
を参照したいとしましょう。私がやっていることは、データを参照するための「ブレッドクラム」タプルを作成することです。次に、これらのブレッドクラムで参照したいクラスを基本クラス say から継承させます。このクラスは、ブレッドクラムを再帰的に解析し、それが参照するデータを返すために使用するメソッドを定義します。val1ABc('b', 'a', 'val1')Breadcrumbgetattr

これはパターンですか?アンチパターン?これをもっと簡単に行う方法、またはプログラムを再設計する方法はありますか?

4

1 に答える 1

1

アクセスするクラスに侵入することにはあまり利点がないと思います (スーパークラスの導入は侵入と見なされます)。属性がこの方法でアクセスされるか、その方法でアクセスされるかを知る必要があるのはなぜですか? getattrこれを実装するために必要なものは、すでにサポートされています。

任意のオブジェクトで機能し、タプルiterative_getattr(obj, attrs)によって定義された属性のチェーンにアクセスする無料の関数を(おそらくもっと良い名前で) 記述します。attrs

于 2012-10-10T12:27:20.460 に答える