2016-09-22 3 views
2

변수를 '키'로 사용하여 'self'구문에서 저장된 값을 얻으려면 어떻게해야합니까?이름으로 변수 가져 오기

일부 코드 :

class Foo: 
    def __init__(self, n1, n2, n3, ...): 
     self.node_1 = n1 
     self.node_2 = n2 
     self.node_3 = n3 

     ... 
    def get_node(n): 
     return self."node_"+n # This is wrong. What should I use? 
  1. 내가 21의 값을 가지고 있기 때문에 나는, switch 문을 수행 할 수 없습니다

    ...

  2. 그냥 n = 2 경우, 추가 명확하게하기 값을 self.node_2으로 지정하겠습니다. 그래서 n = 3 당신은 getattr(class_obj, 'property')을 사용할 수있는 등

+3

'self.nodes'리스트가 없습니까? 문자열에 저장된 이름으로 속성에 액세스 할 수 있지만 노드 목록은 훨씬 더 의미가 있습니다. – user2357112

+1

Ad-hoc 솔루션? 'getattr' 함수. 정확한 해결책은 항상 "동적 변수 이름이 필요합니다"는 dict (이름이 실제로는 임의적이어야하는 경우) 또는 목록 (원하는 경우 var1, var2, ... varN)을 사용하는 것입니다. –

+0

이 질문은 중복되지 않습니다. 동일한 대답을 가진 질문은 * 항상 * 같은 질문이 아닙니다. –

답변

5

, self.node_3입니다. 클래스의 객체와 속성을 string으로 액세스 할 때 해당 속성의 값을 가져옵니다. 아래의 샘플 코드는 다음과 같습니다 당신은 또한 당신이 속성의 거대한 목록을 언급 한 바와 같이 **args를 사용하도록 __init__() 방법을 업데이트해야하지만

class MyClass: 
    def __init__(self, n1, n2): 
     self.node_1 = n1 
     self.node_2 = n2 

    def get_node(self, n): 
     return getattr(self, n) 

x = MyClass('value_1', 'value_2') 

print x.get_node('node_1') 
# Output: 'value_1' 

. setattr(class_obj, 'property', value)과 함께 enumerate()을 사용하면 속성을 동적으로 설정할 수 있습니다. 아래는 그 예입니다 :

>>> class MyClass: 
...  def __init__(self, *args): 
...   for i, item in enumerate(args): 
...    setattr(self, 'node_{}'.format(i+1), item) 
...  def get_node(self, n): 
...   return getattr(self, n) 
... 
>>> x = MyClass(1, 2, 3, 4) 
>>> x.get_node('node_1') 
1 
>>> x = MyClass('a') 
>>> x.get_node('node_1') 
'a'