メタプログラミング(本と学びの段階)
https://docs.google.com/presentation/d/11QQ7yGf_9lF3Uy5JjrmZIQOrWvInZ7PkPvwt3UEpeyM/edit#slide=id.gf77837ba43_0_157 から
メタクラスを使う方法
デコレータによるメタプログラミングもある(エキPy 5章?参照)
メタクラスとは、他の型(クラス)を定義するクラス
typeは組み込みの型(クラス)
typeクラスをインスタンス化するとクラス
クラスをインスタンス化するとインスタンス
typeを継承したクラスがメタクラス
メタクラスはクラスが読み込まれたときに動作
varsで属性をチェック
MyClassで定義していない属性をもたせられる
例:Python enum
enumの数値定義不要にする(ImplicitEnum)
RED, GREENなどの名前に興味があり、1,2,3はどうでもいい
RED = 1の行をREDと書きたい(メンバーの名前だけで定義したい)
→NameError
メタクラスを使った例(slide=23)
メタクラスを使って数値定義不要のEnumを作る
enum を拡張する extenum パッケージを作りました
Enumの開発者のメモを参考にしたとのこと
標準の範囲でのやり方
auto()を使う
Color = Enum("Color", ["RED", "GREEN", "BLUE"])
functional styleでのEnumの定義(クラススタイル以外の書き方)
メタプログラミングをいつ使うのか(slide=26)
いつ使うのかという質問をしている人は使う必要がない
メタプログラミングを必要としている人にはその理由がわかっているから
理由=便利さ
デメリットよりメリットが上回るときに使う
メリット:通常のプログラミングでできないことができる
デメリット
保守コストが大きい
import時点で処理が動く→パフォーマンス特性が変わる
(保守コスト or みんなが便利)
デメリットの事例 PEP 560 – Core support for typing module and generic types
rationale参照 https://www.python.org/dev/peps/pep-0560/#rationale
保守しづらい→CPythonでサポート