2010-12-03 5 views
2

파이썬에서는 여러 변수를로드하여 새 객체를 만들고 싶습니다. 가장 쉬운 방법은 사전을 전달하는 것입니다.하지만 이는 프로그래밍을 매우 짜증나게 만듭니다. self.health 대신 항상 self.params [ 'health']를 호출해야합니다. 변수 이름 (필드)을 동적으로 설정하는 방법이 있습니까?Python : 메서드 내에서 사전 압축 풀기

는 내가 가진 :

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

흠 ... 이것은 사전에 '합성 이름'키를 고려하지 않습니다 ... – khachik

+0

@kachik : 나는 원래 질문을 오해했기 때문에 그것을 상당히 개정했다. 궁금해서, 합성 이름 키가 무슨 뜻인지 모르겠다. –

+0

실제로'* params' 대신'** params'를 사용 했습니까? 그것은 __init __()에 전달 된 모든 매개 변수가 (키, 값) 쌍인 경우에만 작동하며 이상하게 보입니다. –

2

당신은 동적 이름 name과 함께 self의 새로운 attritbute을 만들

setattr(self, name, value) 

를 사용할 수 있습니다

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

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

내가 갖고 싶어 값 value. 허용되지 않습니다 당신이 문자를 돌봐

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

escapse_attr_name에서 : 당신의 예에서, 당신은

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

당신은 사전에 나오는 항목에서 인스턴스에 대한 속성을 만들 수 있습니다 쓸 수 속성 이름에는 있지만 키에 있습니다.

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 

당신이 ** kwargs로 구문을 사용하는 경우 객체를 생성 할 때

+0

for 루프가 작동하지 않습니다. 'iteritems()'를 사용해야합니다. :) –

+0

@Sven, 고마워, 고침. – khachik

2

다음이 당신의 구조를 더욱 유연하게 또는 키워드를 사용하여 args :

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