0

私はよく、同種のオブジェクトのセットを作成していることに気づきます。これは通常、dict または list 辞書に保存します。

   a,b,c = MyClass(...), MyClass(...), MyClass(...)
   my_set = {'a':a,'b':b,'c':c}

このようなセットでは、共通のニーズは

  • オブジェクトのプロパティまたはメソッドから同種のセットを返す
    • {k:k.prop for k in my_set}、 また
    • {k:k.func() for k in my_set}
  • プロパティまたはオブジェクトのメソッドの出力に基づくフィルタリング
    • {k:k.prop for k in my_set if k.prop is blah}、 また
    • {k:k.func() for k in my_set if k.func() is blah}
  • 最初の 2 つのニーズをつなぎ合わせる

最初は、これはデータベースを使用する必要があることを示唆しているように見えました。ただし、任意のオブジェクトを要素として使用することによって提供される自由を放棄する必要があります。

このタイプの構造のクラスを作成したいと思います(まだ存在しない場合)。これは、これらのニーズを次のようなもので満たします...

   a,b,c = MyClass(...), MyClass(...), MyClass(...)
   my_set = {'a':a,'b':b,'c':c}
   my_set.prop # fufills first need
   my_set.func() # fufills first need
   my_set[prop = blah] # fufills second need
   my_set[prop= blah].prop.func() # third need

このような機能は存在しますか?それとも、このオブジェクトの必要性は悪い設計の結果ですか?

解決

メソッドをオーバーライドするための@mike-mullerの提案に従って、__getattr__ここにクラスを作成しました

https://gist.github.com/arsenovic/5723000

4

4 に答える 4

0

あなたと同じように、辞書やオブジェクトの大きなリストを操作するケースに遭遇しました。多くの場合、これらのオブジェクトはデータベースから取り出され、ORM を介して入力されますが、私は CSV ファイルでもそれを行いました。

私のニーズが、シンタックスシュガーを提供するモジュールを探すのに十分な頻度/一般的であるかどうかはわかりません。

于 2013-06-05T18:35:34.070 に答える