2010-12-03 7 views
2

Pythonでは、いくつかの変数を読み込んで新しいオブジェクトを作成します。最も簡単な方法は、辞書を渡すことですが、それはプログラミングを非常に迷惑にします:self.healthの代わりに、私はself.params ['health']を常に呼び出さなければなりません。変数名(フィールド)を動的に設定する方法はありますか?Python:メソッド内で辞書を解凍する

私が持っている:

DEFAULT_PARAMS = { 
    'health': 10, 
    'position': [] 
} 

def __init__(self, params = DEFAULT_PARAMS): 
    self.params = params 
    print self.params['health'] 

は私が持っていると思います:

DEFAULT_PARAMS = { 
    'health': 10, 
    'position': [] 
} 

class Name(): 
    def load(self, params): 
     # what goes here? 

    def __init__(self, params = DEFAULT_PARAMS): 
     self.load(params) 
     print self.health 

答えて

5
class Name(object): 
    def __init__(self, *params): 
     self.__dict__.update(DEFAULT_PARAMS) 
     self.__dict__.update(params) 

b = Name(position=[1,2]) 
print b.position 
+0

Hmmm ...これは辞書内の「合成名」キーを考慮しません。 – khachik

+0

@khachik:私は元々疑問を誤解していたので、かなり改訂しました。心配していますが、コンポジット名キーの意味がわかりません。 –

+0

'* params'ではなく' ** params'を実際に使っていましたか?その方法では、 '__init __()'に渡されるすべてのパラメータが '(key、value)'のペアである場合にのみ動作します。これは不思議です。 –

2

あなたは動的な名前nameselfの新しいattritbuteを作成する

setattr(self, name, value) 

を使用してすることができます値valueescapse_attr_name

def __init__(self, params=DEFAULT_PARAMS): 
    ... 
    for k,v in DEFAULT_PARAMS.iteritems(): 
    setattr(self, escape_attr_name(k), v) 
    ... 

をあなたが許可されていない文字の世話をする:あなたの例では、あなたが辞書に来項目からインスタンスの属性を作ることができます

def load(self, params): 
    for name, value in params.iteritems(): 
     setattr(self, name, value) 
0

を書くことができ属性名には含まれていますが、キーには存在します。

+0

あなたのforループは動作しません - あなたは 'iteritems()'を使うべきです:) –

+0

@Sven、thanks、fixed。 – khachik

2

あなたが** kwargsから構文を使用する場合は、オブジェクトを作成するときに、これはあなたの建設は、より柔軟になります:

class MyHealthClass(object): 
    def __init__(self, *args, **kwargs): 
     for key in kwargs: 
      setattr(self, key, kwargs[key]) 
     if not hasattr(self, 'health'): 
      raise TypeError('Needs a health') 
     print self.health 

あなたは、このようなあなたの辞書でこれを呼び出すことができます。

>>> myvar = MyHealthClass(**DEFAULT_PARAMS) 
10 

または、キーワードargsを使用する:

>>> myvar = MyHealthClass(healh=10, wealth="Better all the time") 
10 
>>> print myvar.health 
10 
>>> print myvar.wealth 
Better all the time