1

如果我写这个:

class A:
    def a(self):
        return 2
    def b(self):
        print(self.a())

e = A()

def xa(self):
    return 3 

e.a = xa
e.b()

会爆炸说:

TypeError: xa() missing 1 required positional argument: 'self'

为什么会这样?(如果 xa 没有参数,那么它可以工作,打印 3,但是我无法访问 self)。

这是出于测试目的,而不是实际的生产代码

4

1 回答 1

6

e.a = xa不会创建xa绑定的实例方法(它会隐式传递self),它只是一些存储为实例属性的随机函数。

如果您希望它像绑定方法一样工作,您有两种选择:

  1. 将它附加到类,例如A.a = xa(但会修改类本身,包括所有实例)。这不会自行绑定它,但它会在e.a查找时调用描述符协议,这会触发隐式绑定。
  2. 通过添加到文件顶部并将分配更改为:使用types.MethodType手动将其绑定到实例:import types

    e.a = types.MethodType(xa, e)  # First argument is function to bind, second is instance to bind to
    
于 2019-08-29T15:47:11.690 回答