Open ftnext opened 3 years ago
『Java言語で学ぶデザインパターン入門』
Adapter=Wrapper
len関数を例にすると
__len__
メソッド(Protocolの実装)len
関数 Adapteeを利用するAdapterパターンは既存のクラスには全く手を加えずに、目的のAPIに合わせようとする 例
__len__
protocolの各クラスでの実装には全く手を加えていないlen
関数を変えることなく、Adapteeの__len__
の中身を変えられる
len
関数(Adapter)を使う側は中の処理を知らなくていいので、使う側のコードを変えずにlen
関数(Adapter)のコードを変えられる
__getitem__
を実装して作る、ソートしたキーの順に辞書のバリューを返すコンテナ※スライドではIteratorの理解のために独自実装している認識(コンテナの__iter__
で呼び出している)
参考:スライドの写経 + 抽象基底クラスの継承を試したコード
class MyContainer:
def __init__(self, mapping):
self.keys = sorted(mapping)
self.mapping = mapping
def __getitem__(self, idx):
return self.mapping[self.keys[idx]]
Python 3.9で動作確認
>>> mc = MyContainer({"foo": 1, "bar": 2, "poke": 3, "ah": 4})
>>> for i in mc:
... print(i)
...
4
2
1
3
>>> list(mc)
[4, 2, 1, 3]
偶然スライドを見つけ、興味を持ったのでYouTubeのアーカイブを視聴
一言でいうと
len()
関数、if
文、for
文の動きを掘り下げ、Pythonが使っているProtocolを紹介。 合わせてlen
やbool
といった組み込み関数がAdapterパターンであることも示した発表資料リンク
発表者/所属
shimizukawaさん(BeProud)
発表日付
2017/09/08
概要
対象者は「なぜlen"関数"?」「len関数ということは、Pythonはオブジェクト指向ではない?」という疑問を持っている人。
len関数はオブジェクトの
__len__
メソッドを呼び出すが、返り値がintかチェックしている。 intになることを保証している(TypeError) →これがAdapterパターン__len__
メソッドはプロトコル。オブジェクトに実装されていて、len関数でも使う(オブジェクトとAdapterが通信する規約) プロトコルはオブジェクトの振る舞いを決めているものif
文はbool
関数を呼び出す。bool
関数もAdapter。オブジェクトの__bool__
を呼び出す オブジェクトに__bool__
がない場合、__len__
を呼び出す。__len__
の返り値(intと期待)が持つと期待される__bool__
を呼び出してTrue/Falseを得るfor
文はiter
関数を呼び出す(※)iter
関数もAdapter。オブジェクトの__iter__
または__getitem__
を実行してIteratorを返す(※Iteratorパターンでもある) iteratorは対象のオブジェクトと現在何番目かを持っている__next__
は値を素通し__iter__
は自身を返す抽象基底クラス(例:Iterator)を継承して、Protocol実装を強制できる。 これにより対応Protocolを明示できる
(※)
[以下はオプション]
新規性・差分
len
関数があることでhttps://docs.python.org/ja/3/faq/design.html#why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list
トークで知って試したいこと
感想