2014-03-25 45 views
1

我知道如何遍历一个类的所有变量,但是如果我只想循环其中的一些变量呢?循环遍历Python中某个类的一些变量

class MyClass: 
    def __init__(self,var1,var2,var3,var4): 
     self.var1 = "foo" 
     self.var2 = "bar" 
     self.var3 = "spam" 
     self.var4 = "eggs" 

items_to_loop = ("var2","var4") 
for item in items_to_loop: 
    print(item, MyClass.(item)) 

不起作用。我该怎么做呢?

回答

0

我想你要循环该类的实例的所有变量,因为self.var1不属于类,但它

要遍历一个对象的属性命名实例,你可以做到这一点

for var in list_of_vars: 
    getattr(obj, var) 

eg

class MyClass: 
    def __init__(self): 
     self.var1 = "foo" 
     self.var2 = "bar" 
     self.var3 = "spam" 
     self.var4 = "eggs" 

obj = MyClass() 
for var in vars(obj): 
    print(var, getattr(obj, var)) 

将输出:

('var4', 'eggs') 
('var1', 'foo') 
('var3', 'spam') 
('var2', 'bar') 
0

我能促使你改变你的数据的结构?例如:

class MyClass: 

    def __init__(self,var1,var2,var3,var4): 
     self.var = ["foo", "bar", "spam", "eggs"] 

更清洁。您可以立即看到各种数据的关联,遍历它们变得微不足道。在这种情况下,你甚至可以做这样的事情:

for item in instance.var[1::2]: 
    ... 

当然,如果你只是使用这些作为一个非常简单的例子,你的属性真的不相关,但要循环在一组人,无论如何,然后做的方式是getattr

for name in items_to_loop: 
    value = getattr(instance, name) 
    ... 

或者,如果你经常这样做,你可以使用operator.attrgetter

getter = operator.attrgetter(*items_to_loop): 
for value in getter(instance): 
    ... 
1

首先,您需要了解类和类的实例(即对象)之间的区别。

在您的代码中,MyClass 不包含包含名称为var1 .. var4的属性。但是,如果创建该类的实例,则该实例将包含这些属性。然后,您可以使用hasattr检查,如果这样的属性存在访问这些属性和getattr找到它的价值:

my_object = MyClass() 
for attr_name in ('var1', 'var2'): 
    if hasattr(my_object, attr_name): 
     print getattr(my_object, attr_name) 

注意类本身允许有属性,但他们声明,并从实例属性表现不同:现在

class MyClass(object): 

     class_var1 = 'Hello' 
     class_var2 = "Goodbye' 

     def __init__(self, var1, var2): 
      self.var1 = var1 
      self.var2 = var2 

,MyClass的有单属性class_var1,class_var2这将是相同的,无论有多少类型的对象MyClass的创建,而这些对象的每一个都会有属性称为VAR1和VAR2这些值能每个实例都不相同。

+0

非常有帮助!我知道类和实例,但错过了“getattr”。谢谢! – user3457927