のように動作するカスタムクラスを記述したい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
[編集]
上記のコードサンプルを編集して、デスクから離れる前に行った愚かなエラーを取り除きました。これはタイプミスでした(エラーメッセージから見つけたはずです)。
dict
化する場合super
は、単にインスタンスに委譲するのではなく、オブジェクト自体を(を使用して)使用__dict__
する必要があります。これは、基本的に、インスタンスごとに2つのディクテーションを作成することを意味します。