Python 3 のエキスパートの皆様
python2では、次のことができます(これは少し毛むくじゃらですが、それはここでのポイントではありません:p):
class A(object):
def method(self, other):
print self, other
class B(object): pass
B.method = types.MethodType(A().method, None, B)
B.method() # print both A and B instances
python3 では、バインドされていないメソッドはなくなり、関数だけになりました。同じ動作が必要な場合は、次のようなカスタム記述子を導入する必要があるようです。
class UnboundMethod:
"""unbound method wrapper necessary for python3 where we can't turn
arbitrary object into a method (no more unbound method and only function
are turned automatically to method when accessed through an instance)
"""
def __init__(self, callable):
self.callable = callable
def __get__(self, instance, objtype):
if instance is None:
return self.callable
return types.MethodType(self.callable, instance)
だから私はできる:
B.method = UnboundMethodType(A().method)
B.method() # print both A and B instances
そのような記述子を書かずにそれを行う他の方法はありますか?
ティア