What is the method-wrapper type in Python 3? If I define a class like so:
class Foo(object):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return self.val == other.val
And then do:
Foo(42).__eq__
I get:
<bound method Foo.__eq__ of <__main__.Foo object at 0x10121d0>>
But if I do (in Python 3 ):
Foo(42).__ne__
I get:
<method-wrapper '__ne__' of Foo object at 0x1073e50>
What is a “method-wrapper” type?
Edit: sorry to be more accurate: class method-wrapper is the type of __ne__, as if I do:
>>> type(Foo(42).__ne__)
<class 'method-wrapper'>
Whereas the type of __eq__ is:
>>> type(Foo(42).__eq__)
<class 'method'>
Furthermore method-wrapper seems to be the type of any undefined magic method on a class (so __le__, __repr__, __str__ etc if not explicitly defined will also have this type).
What I am interested in is how the method-wrapper class is used by Python. Are all “default implementations” of methods on a class just instances of this type?
This is because ‘unbound methods’ don’t exist in Python 3.
In Python 2.x, we had bound methods and unbound methods. A bound method was bound to an object, meaning that when it was called, it passed the object instance as the first variable (
self, normally). An unbound method was one where the function was a method, but without a instance it belonged to – it would throw an error if something other than an object instance was passed in to the method.Now, in 3.x, this has been changed. Instead of bound/unbound methods, when you request a method of an object, it returns the function object, but wrapped in a wrapper function that passes the instance variable in. This way there is no need to make a distinction between bound and unbound methods – bound methods are wrapped, unbound are not.
To clarify the difference:
2.x:
3.x:
a.methodcan be thought of as:For more on this, check out Guido’s blog – the history of Python.
Edit:
So, the reason this all applies is that, here,
__ne__()has not been overridden – it’s at a default state, which is an identity check, implemented in C (line 980ish). The wrapper is there to provide the method with the above functionality.