1. ホーム
  2. class

[解決済み] クラスインスタンスのプロパティを辞書から作成する?

2023-06-10 03:29:55

質問

CSVからインポートしていますが、おおよそ次のようなフォーマットでデータを取得しています。

{ 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 }

フィールドの名前は動的です。(まあ、Field1 と Field2 以外にもあるかもしれないという意味で動的なのですが、私が知っているのは Field1Field2 は常に存在することになります。

この辞書をクラスに渡せるようにしたいのですが allMyFields に渡して、上記のデータをプロパティとしてアクセスできるようにしたいです。

class allMyFields:
    # I think I need to include these to allow hinting in Komodo. I think.
    self.Field1 = None
    self.Field2 = None

    def __init__(self,dictionary):
        for k,v in dictionary.items():
            self.k = v
            #of course, this doesn't work. I've ended up doing this instead
            #self.data[k] = v
            #but it's not the way I want to access the data.

q = { 'Field1' : 3000, 'Field2' : 6000, 'RandomField' : 5000 }
instance = allMyFields(q)
# Ideally I could do this.
print q.Field1

何か提案はありますか?理由としては -- コードヒンティングを利用できるようにしたいのと、データを辞書にインポートして data という辞書にデータをインポートしても、そのようなことはできません。

(変数名は実行時まで解決されないので、私はまだKomodoに骨を折る必要がありそうです。 self.Field1 = None で十分だと思います)。

それで - 私がしたいことはどうすればいいのでしょうか?それとも、私は設計の悪い、非Pythonの木に吠えているのでしょうか?

どのように解決するのですか?

あなたは setattr (を使うことができます(ただし、すべての文字列が有効な属性名とは限りませんので、注意してください!)。

>>> class AllMyFields:
...     def __init__(self, dictionary):
...         for k, v in dictionary.items():
...             setattr(self, k, v)
... 
>>> o = AllMyFields({'a': 1, 'b': 2})
>>> o.a
1

編集します。 上記のコードと SilentGhostの回答 . 上のコードは インスタンス属性 が与えられた辞書に基づいているクラスを作成します。SilentGhost のコードでは、クラスが作成され、そのクラスの クラス属性 は与えられた辞書に基づいています。

あなたの特定の状況に応じて、これらのソリューションのいずれかがより適切であるかもしれません。1 つまたは複数のクラス インスタンスを作成することが必要ですか? 答えが 1 つの場合、オブジェクトの作成を完全にスキップして、型のみを構築することもできます (したがって SilentGhost の答えに従います)。