メタクラスで作成されたクラスのクラス属性を破棄し、それらの引数からのデータからメソッドを構築し、動的に作成されたメソッドをクラスオブジェクトに直接アタッチするメタクラスを実装しました(問題のクラスでは、次のWebフォームオブジェクトを簡単に定義できます。 Webテストフレームワークで使用)。正常に機能していますが、より複雑なタイプのメソッドを追加する必要があります。これをクリーンに保つために、呼び出し可能なクラスとして実装しました。残念ながら、インスタンスで呼び出し可能クラスを呼び出そうとすると、インスタンスメソッドではなくクラス属性として扱われ、呼び出されたときに独自のを受け取るだけself
です。なぜこれが起こるのかはわかりますが、私が思いついたものよりも誰かがより良い解決策を持っているのではないかと期待していました。問題の簡略図:
class Foo(object):
def __init__(self, name, val):
self.name = name
self.val = val
self.__name__ = name + '_foo'
self.name = name
# This doesn't work as I'd wish
def __call__(self, instance):
return self.name + str(self.val + instance.val)
def get_methods(name, foo_val):
foo = Foo(name, foo_val)
def bar(self):
return name + str(self.val + 2)
bar.__name__ = name + '_bar'
return foo, bar
class Baz(object):
def __init__(self, val):
self.val = val
for method in get_methods('biff', 1):
setattr(Baz, method.__name__, method)
baz = Baz(10)
# baz.val == 10
# baz.biff_foo() == 'biff11'
# baz.biff_bar() == 'biff12'
私は考えました:
- 記述子を使用しますが、これはここで必要なものよりもはるかに複雑に思えます
- のためにファクトリ内でクロージャを使用します
foo
が、ネストされたクロージャは、ほとんどの場合、オブジェクトの醜く厄介な置き換えです、imo - インスタンスを、基本的にはデコレータとしてインスタンスに
Foo
渡すメソッドでインスタンスをラップします。これは、実際に追加するものですが、これは不要で、基本的に(2)と同じことを行うためのより複雑な方法のようです。self
Foo
instance
Baz
私が望むことを達成するためにこれらのいずれかよりも良い方法はありますか、それとも私は弾丸を噛んでクロージャーファクトリータイプのパターンを使用する必要がありますか?