Что такое wrapper_descriptor, и почему Foo.__ init __() в этом случае?

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

Googling дает очень мало полезной информации о том, что именно представляет собой wrapper_descriptor, и почему пустой класс имеет метод __init__, который не является методом, а скорее wrapper_descriptor.

Что именно здесь происходит? У всех классов без методов __init__ есть одна из этих вещей wrapper_descriptor? Почему существует __init__ в классе dict?

Ответ 1

На что вы столкнулись - это деталь реализации. Это довольно типично для классов, реализованных на C, поскольку object is. Это не метод Python, это метод C, и оболочка является частью этого интерфейса.

Почему существует __init__ в классе dict?

Это не в классе dict, это в object dict. object имеет __init__, поэтому при попытке вызвать методы базового класса класса __init__ с помощью super() он не подлежит.