Python 3中的方法包装器类型是什么?如果我这样定义一个类:
class Foo(object):
def __init__(self, val):
self.val = val
def __eq__(self, other):
return self.val == other.val
Run Code Online (Sandbox Code Playgroud)
然后做:
Foo(42).__eq__
Run Code Online (Sandbox Code Playgroud)
我明白了:
<bound method Foo.__eq__ of <__main__.Foo object at 0x10121d0>>
Run Code Online (Sandbox Code Playgroud)
但如果我这样做(在Python 3中):
Foo(42).__ne__
Run Code Online (Sandbox Code Playgroud)
我明白了:
<method-wrapper '__ne__' of Foo object at 0x1073e50>
Run Code Online (Sandbox Code Playgroud)
什么是"方法包装"类型?
编辑:抱歉更准确:class method-wrapper是类型__ne__,就像我做的那样:
>>> type(Foo(42).__ne__)
<class 'method-wrapper'>
Run Code Online (Sandbox Code Playgroud)
而类型__eq__是:
>>> type(Foo(42).__eq__)
<class 'method'>
Run Code Online (Sandbox Code Playgroud)
此外,method-wrapper似乎是类上任何未定义的魔术方法的类型(因此__le__,如果没有明确定义__repr__,则__str__等也将具有此类型).
我感兴趣的是method-wrapperPython 如何使用该类.类的方法的所有"默认实现"都只是这种类型的实例吗?
import inspect
class Foo(object):
pass
if __name__ == '__main__':
print type(Foo.__init__)
print inspect.getsourcelines(Foo.__init__)
Run Code Online (Sandbox Code Playgroud)
输出:
<type 'wrapper_descriptor'>
Traceback (most recent call last):
*snip*
File "/usr/lib/python2.7/inspect.py", line 420, in getfile
'function, traceback, frame, or code object'.format(object))
TypeError: <slot wrapper '__init__' of 'object' objects> is not a module, class, method, function, traceback, frame, or code object
Run Code Online (Sandbox Code Playgroud)
谷歌搜索几乎没有提供有关什么,确切地说,wrapper_descriptor是什么,以及为什么空类有一个__init__方法不是一个方法,而是一个wrapper_descriptor.
到底发生了什么?没有__init__方法的所有类都有这些wrapper_descriptor之一吗?为什么__init__课堂上有一个词典呢?
1)True.__init__给出
`<method-wrapper '__init__' of bool object at 0x9efaa0>`
Run Code Online (Sandbox Code Playgroud)
2)int.__init__给出
`<slot wrapper '__init__' of 'object' objects>`
Run Code Online (Sandbox Code Playgroud)
有什么不同?