Pythonメタクラスとクラスデコレータの主な違いは何ですか?一方ではできるが、もう一方ではできないことはありますか?
2 に答える
デコレータははるかに単純で制限があります。したがって、メタクラスまたはクラスデコレータのいずれかを使用して目的の効果を実現できる場合は、常にデコレータを使用することをお勧めします。
クラスデコレータでできることはすべて、もちろんカスタムメタクラスでもできます(「デコレータ関数」の機能を適用するだけです。つまり、メタクラス__new__
または__init__
クラスオブジェクトになります!-)。
カスタムメタクラスではできるがデコレータではできないことはたくさんあります(もちろん、デコレータがカスタムメタクラスを内部で生成して適用しない限り、それは不正行為です;-)...そしてそれでもPython3では事後ではなく、カスタムメタクラスでのみ実行できることです...しかし、それはあなたの質問のかなり高度なサブニッチなので、より簡単な例を挙げましょう)。
たとえば、(またはPython3ではもちろん;-)が表示されるX
ようなクラスオブジェクトを作成するとします。ここでは、メタクラスのオーバーライドが重要なアクターであるため、カスタムメタクラスなしでこれを行うことはできません。つまり、クラスのカスタムメタクラスにが必要です。print X
print(X)
peekaboo!
__str__
def __str__(cls): return "peekaboo!"
X
同じことがすべてのマジックメソッドに適用されます。つまり、クラスオブジェクト自体に適用されるすべての種類の操作に適用されます(クラスで定義されたマジックメソッドを使用するインスタンスに適用される操作とは対照的に、クラスオブジェクト自体の操作)メタクラスで定義されているマジックメソッドを使用します)。