我知道如何循环遍历类的所有变量,但是如果我只想循环其中的一些变量呢?
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 :(得分: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):
...