在Python中循环一个类的​​一些变量

时间:2014-03-25 02:54:09

标签: python class variables loops

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

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

不起作用。我该怎么做?

3 个答案:

答案 0 :(得分: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的属性,并且这些值对于每个实例可以是不同的

答案 1 :(得分:0)

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

要遍历对象的命名属性,您可以执行此操作

for var in list_of_vars:
    getattr(obj, var)

e.g。

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

答案 2 :(得分: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):
    ...