11.5.1type関数とclass
構文type関数(第二構文)
type(name, bases, disc)
name :クラスの名前
bases :基底クラス群(タプル)
disc :クラス定義
構文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()
...
私の名前は山田太郎です!
>>>
・クラスはtypeクラスのインスタンス
1.最初に
show関数を定義します。これはインスタンスメソッドで、Personクラスのオブジェクトがこのメソッドを呼び出すと、そのオブジェクトのlastnameとfirstname属性を使ってメッセージを表示します。
2.次にtypeというビルトイン関数(メタクラス)を使用してPersonクラスを生成します。typeは三つの引数を取ります。- 第一引数は生成するクラスの名前です。
- 第二引数はタプル形式で基底クラス(親クラス)を指定します。ここでは
objectを基底クラスとしています。 - 第三引数は辞書形式でクラスの属性やメソッドを指定します。ここでは初期化メソッド
__init__と先ほど定義したshowメソッドを設定しています。
3.そして最後に、__main__で生成したPersonクラスからオブジェクトpを作り、そのshowメソッドを呼び出しています。これにより、「私の名前は山田太郎です!」と表示されます。
メタクラスはクラスのクラスで、クラスの振る舞い(例えば、インスタンス生成方法など)を定義します。このコードではtypeメタクラスを使って動的にクラスを生成していますが、メタクラスはもっと複雑な使い方も可能で、たとえばクラスの属性やメソッドの動的な追加、継承の制御、クラスの自動登録など、クラス生成のプロセスを細かく制御するために使用されます。
・クラスはtypeクラスのインスタンス
>>> print(type(Person))
<class 'type'>
>>> print(isinstance(Person, type))
True
>>>
コメント