関数は、lambda
またはで定義されているかどうかにかかわらdef
ず、メソッドではありません。
そのタイプを変更することはできません。メソッドには関数よりも多くの情報が含まれており、オブジェクトにバインドされています。self
これが、Python が最初の ( ) パラメータに何を渡すかを知る方法です。
あなたの場合、オブジェクトにバインドされていないバインドされていないメソッドを探していますが、まだクラスにバインドされています。
通常の場合 (定義def
内でメソッドをclass
作成し、クラスのインスタンスを作成し、そのインスタンスでメソッドを呼び出す場合)、これは自動的に行われます。(詳細については、メソッドの仕組みを参照してください。) しかし、すべてを自分で行う場合は、バインドされたメソッドを自分で作成する必要があります。
Python の他の型と同様に、これを行うには、型をコンストラクターとして呼び出します。問題は、「バインドされたメソッド」が組み込み型としてアクセスできないことです。つまりtypes
、「標準の Python インタープリターで使用されるいくつかのオブジェクト タイプの名前を定義する」モジュールに移動する必要があります。このような:
bound = types.MethodType(func, my_obj, type(my_obj))
unbound = types.UnboundMethodType(func, None, my_type)
しかし、多くの場合、これを行う正当な理由がないことに注意してください。クロージャにオブジェクトを簡単に詰め込むことができます。これらの callable はすべて同じことを行います:
func = lambda self: self
bound = types.MethodType(func, my_obj, type(my_obj))
func2 = lambda: my_obj
func3 = lambda self: self
unbound = types.UnboundMethodType(func, None, my_type)
func3a = lambda: unbound(my_obj)
最後に 2 つの考え:
descriptors について理解していれば、@property
動作させる魔法とバインドされたメソッドを動作させる魔法は互いに干渉します。それがエンソーフの特性に当てはまるかどうかはわかりませんが、そうかもしれません。したがって、あなたの質問に対する答えは、「それはできません」となる可能性があります。代わりに、Function
特性を作成してから、その特性を明示的に呼び出すラッパー メソッドを作成する必要があります。
Python 2.x の代わりに 3.x を使用すると、バインドされていないメソッドがなくなります (クラスは単純な古い関数を使用するだけです)。