2016-09-22 104 views
2

如何從'self'語法中使用變量作爲'key'來獲取保存的值?通過名稱獲取變量

一些代碼:

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. 我不能做一個switch語句,因爲我有21個值...

  2. 只是令人格外清楚,如果n = 2 ,我想要價值self.node_2。所以n = 3self.node_3

+3

你爲什麼不只是'self.nodes'列表?雖然你可以*通過存儲在字符串中的名字訪問屬性,但是節點列表會更有意義。 – user2357112

+1

臨時解決方案? 'getattr'功能。對於「我需要動態變量名稱」的正確解決方案是使用字典(如果名稱必須是真正任意的)或列表(如果您想要var1,var2,... varN)。 –

+0

這個問題不是重複的。相同答案的問題不是*總是*同一個問題。 –

回答

5

您可以使用getattr(class_obj, 'property')。在傳遞類的對象和屬性以訪問string時,您將獲得相應屬性的值。下面是示例代碼:

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' 

但是你也應該更新您的__init__()方法使用**args正如你所說,你有屬性的巨大的名單。使用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'