10

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

そのような記述子を書かずにそれを行う他の方法はありますか?

ティア

4

2 に答える 2

1
B.method = lambda o: A.method(o,A())

b = B()
b.method()

次に、回線がb.method()を呼び出しますA.method(b,A())。これは、毎回 A が初期化されることを意味します。これを回避するには:

a = A()
B.method = lambda o: A.method(o,a)

これで、B の任意のインスタンスで b.method() を呼び出すたびに、同じ A のインスタンスが 2 番目の引数として渡されます。

于 2012-11-07T21:31:44.077 に答える