Skip to main content
 首页 » 编程设计

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

2025年05月04日15yxwkf

如果我这样写:

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)。

这是为了测试目的,而不是实际的生产代码

请您参考如下方法:

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

如果你想让它像绑定(bind)方法一样工作,你有两个选择:

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

    e.a = types.MethodType(xa, e)  # First argument is function to bind, second is instance to bind to