【问题标题】:Why does setting a method in a python class does not pass self when called?为什么在python类中设置方法在调用时不传递self?
【发布时间】:2020-01-02 22:21:36
【问题描述】:

如果我这样写:

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

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

【问题讨论】:

  • self 只是一个名字。你可以写mickeyMouse 而不是self,一切都一样。如果你想定义一个实例方法而不是一个碰巧是可调用的实例属性,你想在类上设置属性。
  • 很好的解释here

标签: python python-object


【解决方案1】:

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

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

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

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

【讨论】:

  • 删除了我的答案,因为你的答案更快更好,+1
猜你喜欢
  • 2017-11-19
  • 2020-09-27
  • 2016-08-02
  • 2022-11-13
  • 2015-12-07
  • 2021-12-13
  • 2020-03-19
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多