Python のクラスが作成される仕組み
type、デフォルトメタクラス、クラス作成フックを理解します。
「Python のクラスが作成される仕組み」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
type()はメタクラス
Pythonのすべてのクラスはtypeのインスタンスです。type自体もクラスであり、すべてのメタクラスのメタクラスです。
# These are equivalent:
class Dog:
sound = "woof"
Dog2 = type("Dog2", (), {"sound": "woof"})
print(type(Dog)) # <class 'type'>
print(type(Dog2)) # <class 'type'>type()の3引数形式
type(name, bases, namespace)は、クラスを動的に作成します。これはclass文が内部で行っている処理とまったく同じです。
Animal = type("Animal", (), {"speak": lambda self: "..."})
Dog = type("Dog", (Animal,), {"speak": lambda self: "woof"})
d = Dog()
print(d.speak()) # woofクラス作成の手順
Pythonがclass文を見つけると、次の処理を行います。1) メタクラスを解決する、2) 名前空間を準備する、3) クラス本体を実行する、4) metaclass(name, bases, namespace)を呼び出す。
# class Foo(Base, metaclass=Meta):
# x = 1
#
# Equivalent to:
# namespace = Meta.__prepare__("Foo", (Base,))
# exec(class_body, namespace)
# Foo = Meta("Foo", (Base,), namespace)__prepare__
__prepare__(name, bases, **kw)はメタクラスのクラスメソッドで、クラス本体の実行中に使用する名前空間の辞書を返します。これをオーバーライドすると、OrderedDictやカスタムマッピングを使用できます。
class OrderedMeta(type):
@classmethod
def __prepare__(mcs, name, bases, **kw):
print(f"Preparing namespace for {name}")
return {}
class MyClass(metaclass=OrderedMeta):
x = 1
y = 2typeにおける__new__と__init__の違い
type.__new__はクラスオブジェクトを作成し、type.__init__はそれを初期化します。メタクラスでは、クラス作成をカスタマイズするために__new__をオーバーライドします。
class Singleton(type):
_instances = {}
def __call__(cls, *args, **kw):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kw)
return cls._instances[cls]
class DB(metaclass=Singleton):
pass
print(DB() is DB()) # Trueクラスデコレーターとメタクラス
クラスデコレーターは作成後に適用されますが、メタクラスは作成そのものを制御します。単純な機能追加にはデコレーターを優先してください。作成プロセスに影響を与える必要がある場合にメタクラスを使用します。
def add_repr(cls):
cls.__repr__ = lambda self: f"{cls.__name__}()"
return cls
@add_repr
class Widget:
pass
print(Widget()) # Widget()__init_subclass__
サブクラスが定義されるたびに、基底クラス上で__init_subclass__が呼び出されます。これは、サブクラスの動作をカスタマイズするための、メタクラスに代わる軽量な方法です。
class Plugin:
_registry = []
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
Plugin._registry.append(cls)
class AudioPlugin(Plugin): pass
class VideoPlugin(Plugin): pass
print(Plugin._registry) # [AudioPlugin, VideoPlugin]ABCMeta
ABCMetaは、@abstractmethodによる抽象基底クラスを実現する組み込みメタクラスです。
from abc import ABCMeta, abstractmethod
class Shape(metaclass=ABCMeta):
@abstractmethod
def area(self): ...
class Circle(Shape):
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# Shape() # TypeError: Can't instantiate abstract classクラスのメタクラスを調べる
type(cls)を使用するとクラスのメタクラスを確認でき、cls.__mro__を使用するとメソッド解決順序を確認できます。
class Meta(type): pass
class Foo(metaclass=Meta): pass
print(type(Foo)) # <class '__main__.Meta'>
print(Foo.__mro__) # (Foo, object)メタクラスの継承
クラスのメタクラスは、そのサブクラスに継承されます。2つの基底クラスが異なるメタクラスを持つ場合は、最も派生したメタクラスを使用する必要があり、そうでなければ競合が発生します。
class MyMeta(type): pass
class Base(metaclass=MyMeta): pass
class Child(Base): pass # Child's metaclass is also MyMeta
print(type(Child)) # <class '__main__.MyMeta'>メタクラスを使用する場面
メタクラスは、サブクラスの自動登録、クラスの不変条件の強制、ORMフィールドの検出(DjangoのModelなど)、APIフレームワークのルーティングに使用します。ほとんどの場合は、代わりに__init_subclass__またはクラスデコレーターを使用してください。
# Real-world: Django ORM uses ModelBase metaclass
# to collect field definitions into _meta
# You rarely need a custom metaclass;
# __init_subclass__ covers most plugin/registration patterns確認問題
type("Dog", (Animal,), {"speak": lambda self: "woof"})は何をしますか。
まとめ
すべてのクラスはtypeのインスタンスです。クラス作成の流れは、メタクラスの解決 → 名前空間の準備 → 本体の実行 → メタクラスの呼び出しです。単純なサブクラスフックには__init_subclass__を優先し、クラス作成そのものを制御する必要がある場合にのみ完全なメタクラスを使用してください。
よくある質問
「Python のクラスが作成される仕組み」レッスンは無料ですか?
はい。「Python のクラスが作成される仕組み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「Python のクラスが作成される仕組み」で何を学びますか?
type、デフォルトメタクラス、クラス作成フックを理解します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Python のクラスが作成される仕組み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Python のクラスが作成される仕組み
- カスタムメタクラスの作成
- ディスクリプター: __get__、__set__、__delete__
- __slots__ とメモリ最適化