【问题标题】:What is a wrapper_descriptor, and why is Foo.__init__() one in this case?什么是 wrapper_descriptor,为什么 Foo.__init__() 在这种情况下是其中之一?
【发布时间】:2013-03-19 23:03:59
【问题描述】:
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

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

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

【问题讨论】:

    标签: python initialization


    【解决方案1】:

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

    为什么类字典中有__init__

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

    【讨论】:

    • C API 文档解释了除此之外的一些细节,如果您关心的话。但通常你并不关心“slot wrapper”、“method-wrapper”和类似的东西,你可以像绑定方法、未绑定方法等一样调用它们,但没有任何 Python源代码。
    • 这个 wrapper_description 没有 annotations 成员,任何绕过这个非泛化的方法
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2017-03-28
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多