2012-01-18 3 views
0

私は、特定のタスクを実行するために一緒に働くさまざまなクラスのオブジェクトを持っています。タスクは、(設定ファイルを介して)ユーザによって提供される多くのパラメータを必要とします。パラメータはシステムの深部で使用されます。システム全体で多くのパラメータを使用できるようにするにはどうすればよいですか?

コントローラオブジェクトに設定ファイルを読み込ませ、次に各層のオブジェクトの次のレイヤーなどに適切にパラメータを割り当てることができます。しかし、唯一のオブジェクト自体が必要なパラメータを知っているので、コントローラオブジェクトは他のすべてのオブジェクトについて多くの詳細を学習する必要があります。

もう1つの選択肢は、すべてのパラメータをコレクションにバンドルし、すべての関数呼び出しにコレクション全体を渡すことです(これに相当し、それらを格納するグローバルオブジェクトを作成し、全員がアクセス可能です)。これは見た目が悪く、些細なことが多々あります(たとえば、2つのオブジェクトに同じ名前のパラメータを使用させることはできません)。

答えて

1

私は過去に "グローバルコレクション" の代替を使用していました。

名前付けに関心がある場合:設定ファイルでこれをどのように扱いますか?私が見る方法では、グローバルコレクションは設定ファイルにある同じ情報を表すデータ構造です。したがって、cfgファイルの名前の衝突を解決または回避する方法があれば、グローバルコレクションで同じことができます。

+0

あなたはcfgファイル名の衝突について正しいです。私は*このcfgファイルを持っているかどうかは良いアイデアかどうかは疑問だと思います...実際に多くのパラメータを持っているのであれば、何も表示されません。 – max

+1

何らかの方法でより管理しやすくする。 cfgファイルでは、セクション(例:[this]のような古いウィンドウの.iniファイル)や接頭辞(heading.subheading.parameter)を使用するか、XMLのような本格的な階層構造を使用します。あなたの設定オブジェクトは同じ方法で構造化することができます。そこでは、関連するサブツリーだけに関数を渡すことができます。 –

0

私があなたに夢中になっているような気がしないことを願っています。あなたが避けたいモデルを避けるために、プロパティ集約に関して私が考えていたものに似ています。

また、私はElixirが私を変えてくれた宣言的な雰囲気の一部を傷つけました。

私は、スタックオーバーフローのPython gurusがそれをどのように考えているのか、さらに良い選択肢があるのか​​不思議です。私は大きなkwargsが好きではない、私が好む大きなコンストラクタを避けることができれば。

#!/usr/bin/python 

import inspect 
from itertools import chain, ifilter 
from pprint import pprint 
from abc import ABCMeta 

class Property(object): 

    def __init__(self, value=None): 
     self._x = value 

    def __repr__(self): 
     return str(self._x) 

    def getx(self): 
     return self._x 

    def setx(self, value): 
     self._x = value 

    def delx(self): 
     del self._x 

    value = property(getx, setx, delx, "I'm the property.") 

class BaseClass(object): 

    unique_baseclass_thing = Property() 

    def get_prop_tree(self): 
     mro = self.__class__.__mro__ 
     r = [] 
     for i in xrange(0, len(mro) - 1): 

      child_prop_names = set(dir(mro[i])) 
      parent_prop_names = set(dir(mro[i+1])) 

      l_k = list(chain(child_prop_names - parent_prop_names)) 
      l_n = [ (x, getattr(mro[i],x,None)) for x in l_k ] 
      l_p = list(ifilter(lambda y: y[1].__class__ == Property, l_n)) 

      r.append(
       (mro[i], 
        (dict 
         (l_p) 
        ) 
       ) 
      ) 
     return r 

    def get_prop_list(self): 
     return list(chain(* [ x[1].items() for x in reversed(self.get_prop_tree()) ])) 


class SubClass(BaseClass): 
    unique_subclass_thing = Property(1) 

class SubSubClass(SubClass): 
    unique_subsubclass_thing_one = Property("blah") 
    unique_subsubclass_thing_two = Property("foo") 

if __name__ == '__main__': 

    a = SubSubClass() 

    for b in a.get_prop_tree(): 
     print '---------------' 
     print b[0].__name__ 
     for prop in b[1].keys(): 
      print "\t", prop, "=", b[1][prop].value 
     print 

    for prop in a.get_prop_list(): 

あなたはそれを実行...


SubSubClass 
    unique_subsubclass_thing_one = blah 
    unique_subsubclass_thing_two = foo 

--------------- 
SubClass 
    unique_subclass_thing = 1 

--------------- 
BaseClass 
    unique_baseclass_thing = None 

unique_baseclass_thing None 
unique_subclass_thing 1 
unique_subsubclass_thing_one blah 
unique_subsubclass_thing_two foo 
+0

私はまったく気にしません。しかし、多くの人があなたが質問をしていることを理解しているかどうかはわかりません。 – max

+0

さて、私は答えているだけの質問をしています - これはあなたがやろうとしていることに対する私のアプローチです..猫を皮膚に塗る方法はたくさんあります。私が意味することを見るために 'python singleton'のスタックオーバーフロー検索。 :p – synthesizerpatel

+0

私はあなたのアプローチにかなり興味があります。しかし、それを私の状況にどのように適応させますか? – max

関連する問題