为什么在python类中设置方法在调用时不会传递self?

got*_*ch4 1 python python-object

如果我这样写:

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()
Run Code Online (Sandbox Code Playgroud)

会爆炸说:

TypeError: xa() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

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

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

Sha*_*ger 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
    
    Run Code Online (Sandbox Code Playgroud)