8

スタック オーバーフローの貢献者の皆様、こんにちは。

私は現在 Python を学んでいる初心者のプログラマーで、オブジェクト指向のパラダイムを説明するのに役立つこのサイトにたどり着きました。メタクラスがクラスのクラスであることは知っていますが (メタディレクトリがディレクトリのディレクトリであるなどのように)、何か問題があります:メタクラスとパラメータ化されたクラスの実際の違いは何ですか?ウェブサイトの定義?

可能であれば、2 つの違いを示す Python のコード例を含めてください。ご協力ありがとうございました!

4

2 に答える 2

16

Python には「パラメータ化されたクラス」がない (または必要ない) ため、Python でそれらの例を提供するのは困難です;-)。メタクラスは単に「クラスのクラス」です: 通常type(Py2 では、 から継承してクラスを新しいスタイルにすることを覚えている限り、objectまたは他の組み込み型または他の新しいスタイルのクラス -- 古いスタイル クラスは Py2 のレガシー アーティファクトであり、幸いなことに Py3 では姿を消しました。理想的には、それらについては忘れてください)。typeいくつかの高度な目的のためにカスタム メタクラス (通常はサブクラス化) を作成できますが、必要になる可能性はほとんどありません (特に、python 2.6 以降、カスタム メタクラスを必要としていた多くのことをより簡単に実行できることを考えると)。クラス デコレータを使用)。

クラス C が与えられると、type(C)そのメタクラスになります。

パラメータ化されたクラスは、まったく異なる概念です。Python でこれに最も近いのは、おそらく引数に基づいてクラスを作成して返すファクトリ関数です。

def silly(n):
    class Silly(object):
        buh = ' '.join(n * ['hello'])
    return Silly

Silly1 = silly(1)
Silly2 = silly(2)
a = Silly1()
print(a.buh)
b = Silly2()
print(b.buh)

印刷します

hello
hello hello

繰り返しますが、これは頻繁に必要になるものではありません— 1 つまたはいくつかの引数だけが異なるいくつかのクラスを作成します。とにかく、ご覧のとおり、クラスのクラス (AKA メタクラス) とはまったく関係がありません。これは、常にtypeこの例に含まれています (そして、私が考えることができるほとんどすべてのより現実的な例では、単純な例を示すことを選択しました)。 、これを行うポイントは、現実的で必然的に非常に複雑なものではなく、見分けるのが難しい場合です;-)。

于 2010-08-16T18:48:17.407 に答える
0

この記事は役に立つかもしれません。そしてこれはオールディーズですが、読む価値もあります。これはあなたの質問に完全には答えないことを私は知っていますが、それがあなたに思考の糧を与えることを願っています。

于 2010-08-16T18:39:12.810 に答える