11.5.1type関数とclass
構文type関数(第二構文)
type(name, bases, disc)
name :クラスの名前
bases :基底クラス群(タプル)
disc :クラス定義

>>> def show(self):
...     print(f'私の名前は{self.lastname}{self.firstname}です!')
...
>>> #Personクラスを定義
>>> Person = type(
...     'Person',
...     (object, ),
...     {
...         '__init__': init,
...         'show': show
...     }
... )
>>>
>>> if __name__ == '__main__':
...     p = Person('太郎', '山田')
...     p.show()
...
私の名前は山田太郎です!
>>>
  1. 1.最初にshow関数を定義します。これはインスタンスメソッドで、Personクラスのオブジェクトがこのメソッドを呼び出すと、そのオブジェクトのlastnamefirstname属性を使ってメッセージを表示します。


  2. 2.次にtypeというビルトイン関数(メタクラス)を使用してPersonクラスを生成します。typeは三つの引数を取ります。

    • 第一引数は生成するクラスの名前です。
    • 第二引数はタプル形式で基底クラス(親クラス)を指定します。ここではobjectを基底クラスとしています。
    • 第三引数は辞書形式でクラスの属性やメソッドを指定します。ここでは初期化メソッド__init__と先ほど定義したshowメソッドを設定しています。

  3. 3.そして最後に、__main__で生成したPersonクラスからオブジェクトpを作り、そのshowメソッドを呼び出しています。これにより、「私の名前は山田太郎です!」と表示されます。

メタクラスはクラスのクラスで、クラスの振る舞い(例えば、インスタンス生成方法など)を定義します。このコードではtypeメタクラスを使って動的にクラスを生成していますが、メタクラスはもっと複雑な使い方も可能で、たとえばクラスの属性やメソッドの動的な追加、継承の制御、クラスの自動登録など、クラス生成のプロセスを細かく制御するために使用されます。


・クラスはtypeクラスのインスタンス
>>> print(type(Person))
<class 'type'>
>>> print(isinstance(Person, type))
True
>>>