2016-09-22 154 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'