1. ホーム
  2. python

[解決済み] dict のように動作する Python クラス

2022-06-22 07:51:38

質問

のような振る舞いをするカスタムクラスを書きたい。 dict - を継承しているので dict .

しかし、私の質問は、です。プライベートな dict メンバを __init__() メソッドに追加することはできますか?私はこの意味がわかりません、私はすでに dict を継承していれば dict .

なぜほとんどの継承スニペットが以下のようになるのか、どなたかご指摘いただけないでしょうか?

class CustomDictOne(dict):
   def __init__(self):
      self._mydict = {} 

   # other methods follow

よりシンプルな代わりに...

class CustomDictTwo(dict):
   def __init__(self):
      # initialize my other stuff here ...

   # other methods follow

実は、質問の答えは、ユーザーが直接あなたの辞書にアクセスできないようにする(つまり、あなたが提供したアクセスメソッドを使用しなければならない)ことではないかと思うのですが、いかがでしょうか。

しかし、配列のアクセス演算子についてはどうでしょう [] ? これはどのように実装するのでしょうか?今までのところ、私は [] 演算子を上書きする方法を示す例を見たことがありません。

ですから、もし [] アクセス関数がカスタムクラスで提供されていない場合、継承されたベースメソッドは別の辞書で操作されるのですね。

Pythonの継承の理解度を試すために、以下のスニペットを試してみました。

class myDict(dict):
    def __init__(self):
        self._dict = {}

    def add(self, id, val):
        self._dict[id] = val


md = myDict()
md.add('id', 123)
print md[id]

以下のようなエラーが出ました。

KeyError: < 組み込み関数 id>

上記のコードのどこが問題なのでしょうか?

どうすれば、クラス myDict を修正すれば、このようなコードを書くことができるのでしょうか?

md = myDict()
md['id'] = 123

[編集]をクリックします。

私は机から飛び出す前に作った愚かなエラーを取り除くために、上記のコード サンプルを編集しました。それはタイプミスでした (私はエラー メッセージからそれを発見するべきだったのです)。

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

のドキュメントを確認してください。 コンテナタイプをエミュレートする . あなたの場合、最初のパラメータは addself .