更新-2012/12/13
明確にするために-私はクラスにメソッドを追加する方法にはあまり興味がありません-以下の私の質問と人々の回答でわかるように、それを行うには複数の方法があります(頬の舌と帽子の先端私のPerl自己)。
私が興味を持っているのは、さまざまなアプローチを使用してクラスにメソッドを追加することの根本的な違いを学ぶことです。大きな問題は、なぜメタクラスを使用する必要があるのかということです。たとえば、Pythonメタクラスプログラミングの入門書には次のように記載されています。
おそらく、メタクラスの最も一般的な使用法[...]:生成されたクラスで定義されたメソッドの追加、削除、名前の変更、または置換。
そして、それを行う方法は他にもあるので、私は戸惑い、説明を探しています。
ありがとう!
オリジナル-2012/12/12
クラス(およびそのクラスに基づいて新しく生成されたクラス)にメソッドを動的に追加する必要があります。私は2つのアプローチを思いつきました。1つはメタクラスを含み、もう1つはメタクラスなしで行います。後者が「黒魔術」メタクラスを含まないという事実を除いて、2つのアプローチが私に与えるものに違いは見られません;)
メタクラスを使用したアプローチ#1 :
class Meta(type):
def __init__(cls, *args, **kwargs):
setattr(cls, "foo", lambda self: "foo@%s(class %s)" % (self,
cls.__name__))
class Y(object):
__metaclass__ = Meta
y = Y()
y.foo() # Gives 'foo@<__main__.Y object at 0x10e4afd10>(class Y)'
メタクラスなしのアプローチ#2 :
class Z(object):
def __init__(self):
setattr(self.__class__, "foo",
lambda self: "foo@%s(class %s)" %
(self, self.__class__.__name__))
z = Z()
z.foo() # Gives 'foo@<__main__.Z object at 0x10c865dd0>(class Z)'
私の知る限り、どちらのアプローチでも同じ結果と「表現度」が得られます。を使用して新しいクラスを作成しようとしても、type("NewClassY", (Y, ), {})
またはtype("NewClassZ", (Z, ), {})
2つのアプローチ間で異ならない同じ期待される結果が得られます。
それで、アプローチに本当に「根本的な」違いがあるのか、それとも、#1または#2のいずれかを使用した場合、またはそれが単なる構文糖衣である場合に、後で私を「噛む」何かがあるのだろうか。
PS:はい、Pythonとpythonicデータモデルのメタクラスについて話している他のスレッドをここで読みました。