【问题标题】:Loop over some variables of a class in Python在Python中循环一个类的​​一些变量
【发布时间】:2014-03-25 02:54:09
【问题描述】:

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

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))

不起作用。我该怎么做?

【问题讨论】:

    标签: python class variables loops


    【解决方案1】:

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

    在您的代码中,MyClass 包含名称为 var1..var4 的属性。但是,如果您创建类的 instance,该实例将包含这些属性。然后,您可以使用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 的属性,并且每个实例的这些值可能不同.

    【讨论】:

    • 非常有帮助!我知道类和实例,但缺少“getattr”。谢谢!
    【解决方案2】:

    我认为你想遍历该类实例的所有变量,因为self.var1 不属于类,而是它的实例

    要遍历对象的命名属性,您可以这样做

    for var in list_of_vars:
        getattr(obj, var)
    

    例如

    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')
    

    【讨论】:

      【解决方案3】:

      我可以敦促您更改数据结构吗?比如:

      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):
          ...
      

      【讨论】:

        猜你喜欢
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2023-01-25
        • 2015-09-07
        相关资源
        最近更新 更多