types.MethodType python2中的第三个参数

pet*_*tus 7 python python-2.7

我继承了看起来像这样的代码:

class A:
  def __init__(self):
    print('A')

def foo(self, *args):
  print('foo')

a = A()
setattr(a,'foo',types.MethodType(foo,a,A))
Run Code Online (Sandbox Code Playgroud)

对于最后一行,我想使代码2to3兼容,但是MethodType在python3中仅接受两个参数。

最简单的选择可能是使其智能地崩溃并

try:
  setattr(a,'foo',types.MethodType(foo,a,A))
except TypeError:
  setattr(a,'foo',types.MethodType(foo,a))
Run Code Online (Sandbox Code Playgroud)

但是后来我意识到我不明白为什么要在python2中添加第三个参数,因为它setattr(a,'foo',types.MethodType(foo,a))可以跨语言工作。

在Python2中,第三个参数是买我的东西,而不是将它绑定到类上?

>>> types.MethodType(foo,a)
<bound method ?.foo of <__main__.A instance at 0x1>>
>>> types.MethodType(foo,a,A)
<bound method A.foo of <__main__.A instance at 0x1>>
Run Code Online (Sandbox Code Playgroud)

use*_*ica 5

在Python 2中,方法类型构造函数的第三个参数主要用于未绑定的方法对象:

>>> class Foo(object):
...     def bar(self):
...         pass
...
>>> Foo.bar
<unbound method Foo.bar>
Run Code Online (Sandbox Code Playgroud)

创建其中之一的直接构造函数调用看起来像types.MethodType(bar, None, Foo)bar函数在哪里。未绑定方法对象做了一些类型检查,以确保它们不会用于错误类型的对象,但它们被认为没有足够的用处来证明它们的存在,因此它们在 Python 3 中被删除。不再有未绑定方法对象,方法构造函数没有太多理由采用第三个参数,因此它也被删除了。