使用Python有效地迭代对象变量

时间:2015-11-17 03:42:02

标签: python loops oop

我有一个包含大量变量的对象,这些变量都返回Pass,Fail或NA。我正在尝试总结结果以返回通过总数等。

我想做以下事情。

    list_of_checks = [check1, check2, check3]
    for check in list_of_checks:
        for a_object in list_of_objects:
            if a_object.check == "Pass"
                pass_counter += 1
            elif a_object.check == "Fail"
                fail_counter += 1

这不起作用。我得到一个追溯,因为a_object没有属性“check”

这可能吗?还是我必须暴力呢?

2 个答案:

答案 0 :(得分:0)

您无法使用变量check以这种方式访问​​对象的成员。但是你可以做更多的事情:

if getattr(a_object, check) == "Pass":

这两行是等价的:

if getattr(a_object, "check1") == "Pass":

if a_object.check1 == "Pass":

答案 1 :(得分:0)

您可以使用getattr以编程方式检查属性,但不能通过使用绑定到类成员的公共标签来引用作为实例成员的函数。使用getattr要求您要引用的成员的名称以字符串形式给出:

list_of_checks = ['check1', 'check2', 'check3']
for check in list_of_checks:
    for a_object in list_of_objects:
        maybe = getattr(a_object, check)
        if maybe == "Pass":
            pass_counter += 1
        elif maybe == "Fail":
            fail_counter += 1

如果不是每个对象都有" check1"或者其他什么,那么你将获得可以通过

捕获的异常
try:
    if getattr(obj, check) == "Pass"
        # and so on...
except AttributeError:
    # Do whatever

<强> BUT

一般来说,每当我发现我认为我需要try...except子句中的条件的情况时,我通常会查看我和我的情况#39;我刚刚为自己创建了一个XY问题,需要在代码结构中进一步思考,找到一种不需要这些检查的方法。

例如,为什么你没有询问你的对象是否已经通过或失败,以及他们是否通知了得分管理员对象。或者沿着这些方向发展。