進捗
3/13 13:30~17:10 p.294~p.296
気になったのでこのサイトにのコードをもう一度書いて見て試した。
class Setitem:
def __init__(self,item):
self.item = item
def __setitem__(self,key,val):
print('追加しました') #self.item[key] = valとあえて書かない。
"""
実行
s = Setitem({{'main':'たまご','sub':'ごはん'})
s['コーヒー'] = '一杯'
s.item
結果
追加しました
{'main': 'たまご', 'sub': 'ごはん', 'play': 'True'}
"""
"""
辞書で追加する形で書いて特殊メソッドを呼び出しても
ブロックに追加する処理は書いてないので実行されない。
"""
リストはリスト[4] = 5のように辞書と同じ書き方で新しく追加できない。
テキストに書いてあるdict関数を親クラスにした__setitem__メソッドを持つクラスを作った。テキストには初期化メソッドが何もしないよう書かれていたが、引数を一つ用意してself.item = itemとアトリビュートを書いた。
結果、インスタンス.itemの時は引数に入れた辞書が表示されるが、インスタンスだけだとdict関数や
__setitem__メソッド呼び出しに書いたオブジェクトが辞書の形で表示される。別物の扱いだと思った。
またクラスで__setitem__メソッドを使う際に、__setitem__(self,key,value)の下に、dict.__setitem__(self,key,value)と書くことで、親クラスであるdict関数の__setitem__メソッドを継承し、
子クラスでも使うために引数を子クラスの__setitem__メソッドのものであるkey,valueと同じにした。そこから下のブロック内にself.item[key] = valueとは書かずなにもない。dict関数は親クラスだがそのコードは書いてない。
しかし、このクラスでディクショナリに追加するプログラムが動いているのでdictの後に__setitem__とだけ書いて引数を調整すればそれで十分なのだろう。