为什么在 python class 中设置方法在调用时不会通过 self?
Why does setting a method in a python class does not pass self when called?
如果我这样写:
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
成为绑定实例方法(这将隐式传递 self
),它只是一些随机函数存储为实例属性。
如果你想让它像绑定方法一样工作,你有两个选择:
- 将其附加到 class,例如
A.a = xa
(但这会修改 class 本身,包括所有实例)。这不会自行绑定它,但它会在查找 e.a
时调用描述符协议,从而触发隐式绑定。
手动将其绑定到实例 with types.MethodType
,方法是将 import types
添加到文件顶部,并将分配更改为:
e.a = types.MethodType(xa, e) # First argument is function to bind, second is instance to bind to
如果我这样写:
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
成为绑定实例方法(这将隐式传递 self
),它只是一些随机函数存储为实例属性。
如果你想让它像绑定方法一样工作,你有两个选择:
- 将其附加到 class,例如
A.a = xa
(但这会修改 class 本身,包括所有实例)。这不会自行绑定它,但它会在查找e.a
时调用描述符协议,从而触发隐式绑定。 手动将其绑定到实例 with
types.MethodType
,方法是将import types
添加到文件顶部,并将分配更改为:e.a = types.MethodType(xa, e) # First argument is function to bind, second is instance to bind to