Python
1# coding: utf-8
2
3# 普通のディクショナリ(dict)は、keyにint型整数をセットできる
4d1 = dict()
5d1[0] = "a"
6d1[1] = "i"
7d1[2] = "u"
8d1[3] = "e"
9d1[4] = "o"
10print(d1)
11
12# ディクショナリの基本的な機能はそのままで(継承して)、
13# keyにはstr型しかセットできなくしたディクショナリにしたい(StrDictの作成)
14class StrDict(dict):
15 def __init__(self):
16 pass
17 def __setitem__(self, key, value):
18 if not isinstance(key, str):
19 raise ValueError("Key must be string.")
20 dict.__setitem__(self, key, value)
21
22d2 = StrDict()
23# d2[0] = "a" # --> ValueError: Key must be string. が発生する
24d2["0"] = "a" # strならOK
25d2["1"] = "i"
26d2["2"] = "u"
27d2["3"] = "e"
28d2["4"] = "o"
29print(d2)
30
追記
StrDictクラスはdictクラスを継承しています。このとき、dictをスーパークラス、StrDictをサブクラスと言います。
スーパークラスdictには____setitem____(self, key, value)メソッドがありますが、StrDictもdictを継承しているので、同じく____setitem____(self, key, value)メソッドを持っています。今回の例では、StrDictで同名のメソッド____setitem____(self, key, value)を定義しています。スーパークラスの持つメソッドをサブクラスで定義しなおすことを、オーバーライドと呼びます。
それでは、StrDictは____setitem____(self, key, value)をオーバーライドして何をしているのでしょうか?
Python
1 def __setitem__(self, key, value):
2 # スーパークラスの__setitem__()をオーバーライドしている
3 #
4 # d2 = StrDict()
5 # d2["0"] = "a"
6 # が実行されるとき、
7 # key="0", value="a"
8 # を引数として、このメソッドが呼ばれる。
9 if not isinstance(key, str):
10 # keyがstr型でないならば、こっち
11 raise ValueError("Key must be string.")
12 # keyがstr型ならば、こっち
13 # 今回はkey="0"なのでこっち
14
15 dict.__setitem__(self, key, value)
16 # スーパークラスdictの__setitem__(self, key, value)を呼び出す。
17 # つまり、このメソッドではkeyがstr型かどうかだけをチェックし、
18 # ディクショナリの作成処理はスーパークラスのメソッドで行っている。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/29 08:43
2018/09/29 10:05
2018/10/01 02:04