プログラムとか 思ったこととか 徒然ブログ 投稿一覧へ戻る

タグ "__init_subclass__" が付いている投稿一覧

【 Effective Python, 2nd Edition 】サブクラス定義に付随させて必ず行いたい操作がある場合は、メタクラス ( metaclass )、または、__init_subclass__ 特殊関数を利用してド忘れを防止しよう!

Tags: Python , Effective , metaclass , __init_subclass__

Published 2020年7月25日18:42 by T.Tsuyoshi

メタクラスの用途として、ある属性の有無や属性値の値によってクラスの機能を変化させる、サブクラス定義に必要な属性が含まれているか、属性値は有効かを検証する、等がありますが、型を記録しておき将来的に復元可能にする、という操作にも最適です。 例えば、Python オブジェクトの「型紙」をパラメータの値も含めて JSON 形式にシリアル化しておき、将来的な復元に備えて保存したいとします。 そのための第一段階として、あるクラスのインスタンス化時のパラメータ値を JSON 形式にシリアル化しましょう。 import json class Serializable: def __init__(self, *args): self.args = args def __repr__(self): …

【 Effective Python, 2nd Edition 】今回も懲りずにメタクラス ( metaclass ) - __init_subclass__() 特殊関数でメタクラスをもっと活用しよう!

Tags: Python , Effective , __new__ , metaclass , __init_subclass__ , super

Published 2020年7月23日18:23 by T.Tsuyoshi

前回 は、メタクラスでどんなことができるのか、どんな動作をしているのか、ということを少しでも理解しようとモガいてみましたが、今回も懲りずに続きです。 今回はメタクラスの一般的な使い途の1つである「サブクラス定義の検証」を見ていきたいと思います。 「多角形 ( multisided polygon ) 」を象徴するクラスを考えます。 各サブクラスでは「何」角形であるのかを示す sides 属性が定義されていなければならず、その値はベースクラスを除いて 3 以上でなければエラーを投げるようなメタクラスを定義します。 今回の例の Polygon クラス階層において、ValidatePolygon メタクラス によって作成される MyPolygon …