【问题标题】:binding instance method of one class to another class将一个类的实例方法绑定到另一个类
【发布时间】:2021-09-17 15:21:47
【问题描述】:

考虑以下情况:

class test:
  def foo(self, o):
    print(o)

  @staticmethod
  def bar(o):
    print(o)
    
  @classmethod
  def qux(cls, o):
    print(cls)
    print(o)

def baz(o):
  print(o)

t = test()

class A:
  meth1 = t.bar
  meth2 = t.foo
  meth3 = baz
  meth4 = t.qux

a = A()
a.meth1()
a.meth3()
# a.meth4()
# a.meth2()

这很好用,但如果我打电话给meth2/4,我会收到以下错误:

TypeError: <foo/qux>() missing 1 required positional argument: 'o'

有什么方法可以让t.foot.quxt.barbaz 一样工作?

【问题讨论】:

    标签: python methods function-binding


    【解决方案1】:

    A 中的meth4 在此处不被视为类方法,因为您尚未将其定义为这样。

    类方法使用装饰器语法声明,如下所示:

    @decorator
    def func(x, y):
        return z
    

    它本质上定义了一个函数func,然后在其上调用decorator

    因此,您实际上可以只做meth4 = classmethod(t.qux),它工作得非常好。

    对于meth2,我不确定您预期会发生什么。它是一个实例方法,隐式接受self,并接受一个参数o,所以当你调用a.meth2时,当然需要指定一个参数o

    【讨论】:

    • 我希望self 绑定到t,并且当a.meth2 被调用时,它会将a 绑定到o。我基本上是在寻找某种方法来自动将实例方法绑定到缺少的函数参数
    • @ntjess 你可以做到def meth2(self): t.foo(self): Try it online!
    • 好的,谢谢。我更好奇是什么让所有其他方法“自动绑定”,而这在这里不会发生。即,Python 中的什么机制导致 a not 绑定到 meth2/meth4
    • @ntjess 这是描述符协议的一部分,请参阅文档中的functions and methods。相关答案hereherehere。关键在于 Python 3,function 类型会自动获得这种处理,而其他可调用类型(从 staticmethodclassmethod 或简单的可调用类实例或类生成)则不会。
    • @ntjess 其他的实际上并没有绑定。 meth1 有效,因为在a 上调用test.bar 会将第一个参数o 设置为a,因为a.b() 只是type(a).b(a) 的语法。 meth3 出于同样的原因工作;调用a.b() 只是调用该函数b 但第一个参数是a,因此实例方法通常调用它们的第一个参数self
    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多