残念ながら、ここでは特殊な方法である ため、通常の方法はtypes.MethodType
機能しません。__call__
データモデルから:
クラス インスタンスは、クラスに__call__()
メソッドがある場合にのみ呼び出すことができます。x(arguments) は の省略形ですx.__call__(arguments)
。
これは実際に何が呼び出されるかについては少しあいまいですが、クラスにメソッドが必要であることは明らかです。__call__
ある種のハックを作成する必要があります。
class Foo(object):
def __init__(self):
pass
def f(self):
print "f"
def g(self):
print "g"
def __call__(self):
return self.__call__()
f = Foo()
f.__call__ = f.f
f()
g = Foo()
g.__call__ = g.g
g()
__call__
ただし、これには注意してください。インスタンスを呼び出す前にインスタンスにa を設定しないと、無限再帰が発生します。
rebind するマジック属性を実際に呼び出すことはお勧めしません__call__
。ここでのポイントは、python が変換することを実証することです:f()
にf.__class__.__call__(f)
、インスタンスごとに変更するためにできることは何もありません。クラス__call__
は何をしても呼び出されます-クラスの__call__
インスタンスごとの動作を変更するために何かをする必要があるだけです。これは簡単に実現できます。
セッター型のものを使用して、(単純な関数ではなく) 実際にクラスにメソッドを作成できます。もちろん、それをプロパティに変換することもできます。
import types
class Foo(object):
def __init__(self):
pass
def f(self):
print "f"
def g(self):
print "g"
def set_func(self,f):
self.func = types.MethodType(f,self)
def __call__(self,*args,**kwargs):
self.func(*args,**kwargs)
f = Foo()
f.set_func(Foo.f)
f()
def another_func(self,*args):
print args
f.set_func(another_func)
f(1,2,3,"bar")