14
import inspect

class Foo(object):
    pass

if __name__ == '__main__':
    print type(Foo.__init__)
    print inspect.getsourcelines(Foo.__init__)

输出:

<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

谷歌搜索几乎没有提供关于 wrapper_descriptor 究竟是什么以及为什么空类有一个__init__不是方法而是 wrapper_descriptor 的方法的有用信息。

这里到底发生了什么?所有没有__init__方法的类都具有这些 wrapper_descriptor 事物之一吗?为什么__init__类字典中有一个?

4

1 回答 1

10

您遇到的是一个实现细节。这对于用 C 实现的类来说是非常典型的object。它不是 Python 方法,而是 C 方法,包装器是该接口的一部分。

为什么__init__类字典中有一个?

它不在类字典中,它在object字典中。object有一个__init__这样,当您尝试使用 调用您的类的基类的__init__方法super()时,它不会失败。

于 2013-03-19T23:25:27.880 回答