@mutetella: Du verwechselst das Modul selbst mit dem
Typen eines Moduls. "type(module)" gibt letzteres zurück, also quasi die „Modul-Klasse“ von Python:
Code: Alles auswählen
>>> import xml.etree.ElementTree
>>> xml.etree.ElementTree
<module 'xml.etree.ElementTree' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.pyc'>
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> import types
>>> type(xml.etree.ElementTree) is types.ModuleType
True
Jedes Modul hat diesen Typen, sowohl solche aus der Standardbibliothek als auch Drittmodule wie "docutils":
Code: Alles auswählen
>>> import docutils
>>> type(docutils)
<type 'module'>
>>> type(xml.etree.ElementTree) is type(docutils)
True
Jedes Mal, wenn ein neues Modul importiert wird, erzeugt Python intern ein Exemplar dieser „Modul-Klasse“, und führt – vereinfacht gesagt – den Quelltext des Moduls im Namensraum dieses Exemplars aus. Offensichtlich muss diese Modul-Klasse selbst "builtin" sein, denn sonst müsste Python ja beim Importieren eines Moduls erst das Modul mit der Modul-Klasse importieren, wozu aber wieder die Modul-Klasse nötig wäre, die aber wiederum importiert werden müssen… ein klassisches Henne-Ei-Problem.
Daraus folgt aber
nicht, dass dieses neue "Modul-Exemplar" selbst "builtin" ist. Im Gegenteil, Module sind
nie builtin, da ja gerade der Zweck von Modulen darin besteht, dass sie später nachgeladen werden können, und nicht automatisch im Interpreter vorhanden sind.
Ebenfalls folgt daraus nicht, dass die Attribute eines Moduls, also die darin enthaltenen Klassen, "builtin" sind:
Code: Alles auswählen
xml.etree.ElementTree.ElementTree.__module__
'xml.etree.ElementTree'
Lediglich der Typ der Klasse "xml.etree.ElementTree.ElementTree", also quasi die „Klassen-Klasse“, ist dann wieder "builtin":
Code: Alles auswählen
>>> type(xml.etree.ElementTree.ElementTree)
<type 'type'>
>>> type(xml.etree.ElementTree.ElementTree).__module__
'__builtin__'
Aber auch hier gilt wieder, dass jede Klasse in Python, auch solche, die Du beispielsweise selbst erzeugst, diesen Typ haben:
Code: Alles auswählen
>>> class Spam(object):
... pass
...
>>> type(Spam)
<type 'type'>
>>> type(xml.etree.ElementTree.ElementTree) is type(Spam)
True
Im Allgemeinen ist in Python eben
alles ein Objekt, mithin auch Klassen und Module. Es gibt also eine Modul-Klasse und eine Klassen-Klasse, und man muss immer unterscheiden zwischen dem Objekt und seiner Klasse, also beispielsweise einem Modul und der Modul-Klasse und einer Klasse und der Klassen-Klasse.