Ik heb een map met een aantal .py
bestanden erin. elk bestand definieert enkele klassen. Ik heb ook een lege __init__.py
in de directory.
Bijvoorbeeld:
myproject
__init__.py
mymodule
__init__.py
api.py
models.py
views.py
Ik probeer mymodule
te importeren en toegang te krijgen tot de klassen die in al deze bestanden zijn gedefinieerd:
from myproject import mymodule
print mymodule.api.MyClass
Ik krijg een foutmelding dat mymodule
geen attribuut api
heeft. Waarom? En waarom heb ik slechts toegang tot een van de bestanden (models.py
) en niet tot de andere?
In [2]: dir(banners)
Out[2]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'__path__',
'models']
Antwoord 1, autoriteit 100%
Het probleem is dat submodules niet automatisch worden geïmporteerd. U moet de module api
expliciet importeren:
import myproject.mymodule.api
print myproject.mymodule.api.MyClass
Als je er echt op staat dat api
beschikbaar is bij het importeren van myproject.mymodule
, kun je dit in myproject/mymodule/__init__.py
plaatsen:
import myproject.mymodule.api
Dan werkt dit zoals verwacht:
from myproject import mymodule
print mymodule.api.MyClass
Antwoord 2, autoriteit 13%
Als je een idioot bent, zoals ik, controleer dan ook of je je python-bestand niet dezelfde naam hebt gegeven als de module die je probeert te importeren.
Antwoord 3
Modules werken niet zo.
from myproject.mymodule import api
print api.MyClass
Antwoord 4
Je hebt ook een __init__.py
nodig in de map myproject. Dus je modulestructuur zou moeten zijn:
myproject
__init__.py
mymodule
__init__.py
api.py
models.py
views.py