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

よりオブジェクト指向のスタイルを採用しようとしました。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 に答える
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 に答える