背景
Pythonでコンストラクタは__init__
を呼び出す. このようなメソッドのことを, 特殊メソッドとよび、例えば演算子オーバーロードなどが実現できる. ここでは, __missing__
を使ってLeetをやってみる.
特殊メソッド`__missing__'
まずはドキュメントより。
object.__missing__(self, key)
self[key]
の実装において辞書内にキーが存在しなかった場合に、dict
のサブクラスのためにdict.__getitem__()
によって呼び出されます。
Python言語 リファレンス 3.データモデルより引用
https://docs.python.jp/3.5/reference/datamodel.html
つまり, 辞書内にキーがない場合に呼び出される特殊メソッドである. 実例がないとよくわからないし, 実装してみないと身にならないので, Leetで使ってみる.
Leet
Wikipediaより
leet(リート、1337、l33t)は、主に英語圏においてインターネット上で使われるアルファベットの表記法である。leetspeak(リートスピーク)とも呼ばれる。
Wikipedia Leetより引用
https://ja.wikipedia.org/wiki/Leet
例えばAは4, BはI3, Sは5というように変換する.
ここでは, 定義された文字だけLeetにして, ほかはそのまま返すようにする. つまり,
O='0', I='1', S='5', T='7', E='3'
と定義すると,
「NOW IS THE TIME」 = 「N0W 15 7H3 71M3」
と変換するようにする.
解答例
class LeetDict(dict):
def __missing__(self, key):
return key
leet_dict = LeetDict(
O='0',
I='1',
S='5',
T='7',
E='3',
)
question = 'NOW IS THE TIME'
question_list = list(question) # リストにしなくてもOK(shiracamusさんありがとう!)
answer_list = [leet_dict[k] for k in question_list]
print(''.join(answer_list)) # N0W 15 7H3 71M3