これは、Anonyclass
の新しい「クラス」インスタンスを作成していません。 インスタンス属性を設定できるように、バインドされているインスタンスを知る呼び出し可能な属性を設定できます。呼び出し可能がインスタンスに設定されているので、
from functools import partial
class Anonyclass(object):
def __init__(self, **kwargs):
for kwarg, attr in kwargs.items():
if callable(attr):
attr = partial(attr, self)
setattr(self, kwarg, attr)
はこれが必要なmechanism Python uses to bind a method to an instance自動バイパス:
だから、最初の引数としてself
を取る引数として渡された任意の呼び出し可能と仮定すると、あなたがするようにコードを変更することができます - すべての呼び出しに対する「自己」引数を追加します。したがって、同じことを行うにはfunctools.partial
を使用します。 (これはlambdaで行うことができますが、 "attr"変数が正しいメソッドにバインドされ、for
ループに割り当てられた最後の要素を指していないようにラムダの2つのレベルが必要です)
また、あなたが実際にバインドされた属性を持つクラスなくインスタンスを作成したい場合、あなたはちょうどあなたがあなたのコードにkwargs
として取得同じ引数を渡し、type
に電話をかけることができます
def anon_class_factory(**kwargs):
return type("Anonyclass", (object,), kwargs)
これはどのようになりますkwargs
で渡された関数は "実際の"メソッドとして動作します。
[既存のオブジェクトインスタンスにメソッドを追加する](https://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object-instance) –