Python方法包装器类型?

Python 3 中的方法包装器类型是什么?如果我像这样定义一个类:

class Foo(object):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return self.val == other.val
然后做:

Foo(42).__eq__
我得到:

>
但是如果我这样做(在 Python 3 中):

Foo(42).__ne__
我得到:


什么是“方法包装器”类型?

编辑:抱歉更准确:class method-wrapper是 的类型__ne__,好像我这样做:

>>> type(Foo(42).__ne__)

而类型__eq__是:

>>> type(Foo(42).__eq__)

而且method-wrapper似乎是任何不确定的魔术方法的一个类的类型(因此__le__,__repr__,__str__等如果没有明确的定义也会有这种类型)。

我感兴趣的是method-wrapperPython如何使用该类。类上方法的所有“默认实现”都只是这种类型的实例吗?

已邀请:
这是因为 Python 3 中不存在“未绑定方法”。

在 Python 3000 中,未绑定方法的概念已被删除,表达式“A.spam”返回一个普通的函数对象。结果证明,第一个参数必须是 A 的实例这一限制对诊断问题几乎没有帮助,而且常常是高级用法的障碍——有人称其为“鸭子输入自我”,这似乎是一个合适的名称。 (来源)

在 Python 2.x 中,我们有绑定方法和未绑定方法。绑定方法绑定到一个对象,这意味着当它被调用时,它会将对象实例作为第一个变量(self通常为 )传递。未绑定方法是其中函数是一个方法,但没有它所属的实例的方法 - 如果将对象实例以外的其他内容传递给该方法,它将抛出错误。

现在,在 3.x 中,这已经改变了。而不是绑定/未绑定方法,当你请求一个对象的方法时,它返回的是函数对象,但是包裹在一个传入实例变量的包装函数中。 这样就不需要区分绑定和未绑定方法- 绑定的方法被包装,未绑定的不是。

澄清区别:

2.x:

a = A()
f = A.method # f is an unbound method - you must pass an instance of `A` in to it as the first argument.
f = a.method # f is a bound method, bound to the instance `a`.
3.x:

a = A()
f = A.method # f is a function
f = a.method # f is a wrapped function with it's first argument filled with `a`.
a.method 可以认为是:

def method-wrapper():
A.method(a)
有关更多信息,请查看 Guido 的博客 - Python 的历史。

编辑:

所以,这一切都适用的原因是,这里__ne__()没有被覆盖——它处于默认状态,这是一个身份检查,在 C 中实现(第 980 行)。包装器在那里提供具有上述功能的方法。

要回复问题请先登录注册