2009-03-06 12 views
6

は、私はこのようなPythonでクラスをハッキングしてきました。私にはかなりきれいに見えますPythonのメタクラス

def hack(f,aClass) : 
    class MyClass(aClass) : 
    def f(self) : 
     f() 
    return MyClass 

A = hack(afunc,A) 

を。それはクラスAを取ります。新しいクラスを作成してfを呼び出し、新しいクラスをAに再割り当てします。

これはPythonのメタクラスハッキングとどのように違いますか? メタクラスを使用する利点は何ですか?

+0

これを行う理由は何ですか? –

答えて

5

Pythonでのクラスの定義は、型のインスタンス(または型のサブクラスのインスタンス)です。つまり、クラス定義自体はオブジェクトです。メタクラスを使用すると、クラス定義になる型インスタンスを制御することができます。

メタクラスが呼び出されると、クラス定義を完全に書き換えることができます。クラス、その祖先などのすべての提案された属性にアクセスできます。単にメソッドを挿入したりメソッドを削除するだけでなく、継承ツリー、タイプなどを根本的に変更することができます。また、非常にダイナミックで完全に畳み込まれた経験のためにメタクラスを連鎖させることもできます。

実際のメリットはあると思いますが、クラスのタイプはクラスのタイプのままです。あなたの例では、入力:

a_inst = A() 
type(a_inst) 

は、それがMyClassのインスタンスであることを示します。はい、isinstance(a_inst, aClass)Trueを返しますが、動的に再定義されたクラスではなく、サブクラスを導入しました。おそらくキーの違いがあります。

rjhが指摘しているように、匿名の内部クラスもパフォーマンスと拡張性の関係にあります。メタクラスは一度だけ処理され、そのクラスが定義された瞬間と、決して再び処理されません。 APIのユーザーは、関数内で囲まれていないため、メタクラスを拡張することもできます。そのため、ある程度の拡張性が得られます。

この少し古い記事では、実際にあなたがメタクラスでの例で使用されるまさに「機能デコレーション」のアプローチを比較して良い説明があり、そのコンテキストでPythonのメタクラスの進化の歴史を示していますhttp://www.ibm.com/developerworks/linux/library/l-pymeta.html

1

typeも呼び出し可能です。

def hack(f, aClass): 
    newfunc = lambda self: f() 
    return type('MyClass', (aClass,), {'f': newfunc}) 

私はメタクラスの世界に入るためにtype最も簡単な方法を使用して見つけます。

関連する問題