- 開発技術
Pythonメタクラスについて
- #Python

メタクラスとは?
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
Pythonにはメタクラスというものがあります。普段使用しているクラスと違って、クラスの作成はカスタマイズできます。インスタンス化する前に、クラスの属性、メソッド、さらにはクラス自体も変更できます。
メタクラスを使用する理由
メタクラスは、以下のようなさまざまな問題を解決できます。
- 自動登録
プラグインやフレームワークに便利な、クラスが作成されるときに自動的にレジストリに登録できます。 - バリデーション
クラスの属性やメソッドを作成時に検証し、特定の基準を満たしていることを確認できます。 - コード生成
クラス定義に基づいて動的に追加のメソッドやプロパティを生成できます。
メタクラスの使い方
メタクラスを定義するには、type
をサブクラス化し、__new__や__init__などのメソッドをオーバーライドします。
1 2 3 4 |
class MyMeta(type): def __new__(cls, name, bases, attrs): # クラス作成時のカスタム動作 return super().__new__(cls, name, bases, attrs) |
他のクラスの作成で、メタクラスを指定したい場合。
1 2 |
class MyClass(metaclass=MyMeta): pass |
使用例1: クラス属性の強制
以下は、すべてのクラスが特定の属性を持つことを保証するメタクラスの例です。
1 2 3 4 5 6 7 8 9 10 11 |
class VadliationMeta(type): def __new__(cls, name, bases, attrs): if 'required_attribute' not in attrs: raise TypeError(f"{name} は 'required_attribute'属性が必須です。") return super().__new__(cls, name, bases, attrs) class NormalClass(metaclass=VadliationMeta): required_attribute = "ほげほげ" class ErrorClass(metaclass=VadliationMeta): pass |
実行結果
TypeError: ErrorClass は 'required_attribute'属性が必須です。
使用例2: 自動登録
この例では、メタクラスによって作成したクラス履歴は保持できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class RegistryMeta(type): registry = [] def __new__(cls, name, bases, attrs): cls_instance = super().__new__(cls, name, bases, attrs) cls.registry.append(cls_instance) return cls_instance class FirstClass(metaclass=RegistryMeta): pass class SecondClass(metaclass=RegistryMeta): pass print(RegistryMeta.registry) |
実行結果
[<class '__main__.FirstClass'>, <class '__main__.SecondClass'>]
使用例3: クラスメソッドの修正
メタクラスを使用して、クラスにメソッドを修正または追加することもできます。
1 2 3 4 5 6 7 8 9 10 |
class MethodAdder(type): def __new__(cls, name, bases, attrs): attrs['new_method'] = lambda self: f"これは{name}の新しいメソッドです!" return super().__new__(cls, name, bases, attrs) class NewClass(metaclass=MethodAdder): pass obj = NewClass() print(obj.new_method()) |
実行結果
これはNewClassの新しいメソッドです!
結論
メタクラスのキーポイントとしては、インスタンス化する際ではなく、クラスを定義する際で、ルールを強制したり、機能を追加したりすることができることです。クラスの振る舞いを制御または動的に変更する必要があるシナリオでは非常に便利です。メタクラスを理解し使用することで、Pythonプログラミングスキルを大幅に向上させることができます。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>