メタクラスとは
上記の導(dǎo)入を通じて、最終的には漠然とメタクラスに取り込みました。しかし、メタクラスが何なのかはまだわかりません。
クラスを作成するとき、そのほとんどはクラスのインスタンス オブジェクトを作成することです。メタクラスについてはどうでしょうか?メタクラスはクラスの作成に使用されます。これを理解する別の方法は、メタクラスはクラスのクラスであるということです。
上記の type() 関數(shù)の紹介により、type() 関數(shù)を通じてクラスを作成できることがわかりました。
MyClass = type('MyClass', (), {})
実際、type() 関數(shù)はメタクラスです。 type() は、Python がすべてのクラスを作成するためにバックグラウンドで使用するメタクラスです。
これで、type() 関數(shù)が Type ではなく type になっている理由も推測できるようになりました。
これは、文字列オブジェクトの作成に使用されるクラスである str と、整數(shù)オブジェクトの作成に使用されるクラスである int との一貫性を保つためである可能性があります。 type は、クラス オブジェクトを作成するクラスです。これは、__class__ 屬性を検査することで確認(rèn)できます。 Python ではすべてがオブジェクトであることに注意してください。ここではすべてを意味します。これには、整數(shù)、文字列、関數(shù)、クラスが含まれます。これらはすべてオブジェクトであり、すべてクラスから作成されます。
# 整形 age = 23 print(age.__class__) # 字符串 name = '兩點(diǎn)水' print(name.__class__) # 函數(shù) def fu(): pass print(fu.__class__) # 實(shí)例 class eat(object): pass mEat = eat() print(mEat.__class__)
出力結(jié)果は次のとおりです:
<class 'int'> <class 'str'> <class 'function'> <class '__main__.eat'>
ご覧のとおり、上記のすべて、つまりすべてのオブジェクトはクラスを通じて作成されています。そうすると、__class__ の __class__ には何ができるのかが気になるかもしれません。それはありますか?言い換えれば、これらのクラスを作成するクラスは何でしょうか?
上記のコードに基づいて、次のコードを追加し続けることができます:
print(age.__class__.__class__) print(name.__class__.__class__) print(fu.__class__.__class__) print(mEat.__class__.__class__)
出力結(jié)果は次のとおりです:
<class 'type'> <class 'type'> <class 'type'> <class 'type'>
上記の內(nèi)容を注意深く観察して明確にしてください。出力 結(jié)果は、オブジェクトインスタンス mEat の __class__ の整數(shù)年齢、キャラクター作成名、関數(shù) fu および __class__ を出力した結(jié)果です。クラスがクラスの結(jié)果を印刷するとも言えます。印刷されたクラスはすべて type であることがわかります。
最初に述べたように、メタクラスはクラスのクラスです。言い換えれば、メタクラスはクラスの作成を擔(dān)當(dāng)するものです。メタクラスがクラスの生成を擔(dān)當(dāng)していることも理解できます。 type は組み込みのメタクラスです。つまり、Python 獨(dú)自のメタクラスです。