1

我正在编写一个 python 脚本来将各种文件中的数据收集到具有许多属性的对象中。这些属性中的每一个基本上都可以是“ok”、“bad”或“N/A”。根据我调用脚本的参数,哪些属性是“N/A”的变化。

我想要做的是启动所有这些属性默认设置为“ok”的所有对象,然后将那些尚未测量的对象设置为“N/A”(由返回 N/A 列表的函数检查-属性)。(然后我从文件中收集数据以将“坏”的属性设置为“坏”。)

我以为我可以通过字典来做到这一点,但它似乎不起作用/访问属性?

class Myclass:
    def __init__(self, ID):
        self.ID = ID
        self.at1 = "ok"
        self.at2 = "ok"
        self.at3 = "ok"
        self.at4 = "ok"
        # there are a LOT more of these attributes

def foo(unused):
    for i in range(3):
        blurb = Myclass(i)
        unused_dic = {"at1":blurb.at1, "at2":blurb.at2,
                      "at3":blurb.at3, "at4":blurb.at4}
        for key in unused:
            unused_dic[key] = "N/A"
        print blurb.ID, blurb.at1, blurb.at2, blurb.at3, blurb.at4

unused = ["at1","at3"] # this is returned by another function
foo(unused)

这个的输出是:

0 ok ok ok ok
1 ok ok ok ok
2 ok ok ok ok

但我希望并希望:

0 N/A ok N/A ok
1 N/A ok N/A ok
2 N/A ok N/A ok

我做错了什么,我怎么能做对?

4

3 回答 3

4

您没有更改实例的属性,仅更改字典本身的属性。python中的变量不是指针;在一个地方更改字符串不会使更改在其他地方可见。

您可以使用setattr()动态更改实例上的属性:

def foo(unused):
    for i in range(3):
        blurb = Myclass(i)
        for key in unused:
           setattr(blurb, key, "N/A")

但是您必须将实例存储blurb某个地方,可以说上面的代码只是“丢球”。

于 2012-11-30T10:05:03.640 回答
1

你没有修改你的blurb对象。您正在从 修改值unused_dict

您需要将循环更改为:

    for key in unused:
          if key in unused_dic:
              setattr(blurb, key, "N/A") # set attribute 'key' of object blurb to "N/A"
于 2012-11-30T10:10:28.437 回答
1

我尝试采用更面向对象的风格;该setattr功能是您所需要的:

>>> class Myclass:
    def __init__(self, ID):
        self.ID = ID
        self.at1 = "ok"
        self.at2 = "ok"
        self.at3 = "ok"
        self.at4 = "ok"

    def __str__(self):
    return str((self.at1, self.at2, self.at3, self.at4))

    def unused(self, unused):
    for attr in unused:
            setattr(self, attr, 'N/A')
    print self


>>> unused = ["at1","at3"]
>>> for i in range(3):
    m = Myclass(i)
    m.unused(unused)


('N/A', 'ok', 'N/A', 'ok')
('N/A', 'ok', 'N/A', 'ok')
('N/A', 'ok', 'N/A', 'ok')
于 2012-11-30T10:12:40.527 回答