Frage So importieren Sie Klassen, die in __init__.py definiert sind


Ich versuche, einige Module für mich selbst zu organisieren. Ich habe so etwas:

lib/
  __init__.py
  settings.py
  foo/
    __init__.py
    someobject.py
  bar/
    __init__.py
    somethingelse.py

Im lib/__init__.py, Ich möchte einige Klassen definieren, die verwendet werden sollen, wenn ich lib importiere. Jedoch kann ich es nicht herausfinden, ohne die Klassen in Dateien zu trennen und sie zu importieren__init__.py.

Anstatt zu sagen:

    lib/
      __init__.py
      settings.py
      helperclass.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib.helperclass import Helper

Ich möchte so etwas:

    lib/
      __init__.py  #Helper defined in this file
      settings.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib import Helper

Ist es möglich, oder muss ich die Klasse in eine andere Datei trennen?

BEARBEITEN

OK, wenn ich lib von einem anderen Skript importiere, kann ich auf die Helper-Klasse zugreifen. Wie kann ich mit settings.py auf die Helper-Klasse zugreifen?

Das Beispiel Hier beschreibt Intra-Paket Referenzen. Ich zitiere "Submodule müssen oft aufeinander verweisen". In meinem Fall benötigt lib.settings.py den Helper und lib.foo.someobject muss auf Helper zugreifen. Wo sollte ich dann die Helper-Klasse definieren?


76
2018-02-24 17:35


Ursprung


Antworten:


  1. "lib/Das übergeordnete Verzeichnis muss in sein sys.path.

  2. Ihre 'lib/__init__.py'könnte so aussehen:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass
    

Dann sollte das folgende Beispiel funktionieren:

from lib.settings import Values
from lib import Helper

Beantworten Sie die bearbeitete Version der Frage:

__init__.py definiert, wie Ihr Paket von außen aussieht. Wenn Sie verwenden müssen Helper im settings.py dann definieren Helper in einer anderen Datei z.B.lib/helper.py".

.
| `- import_submodule.py
    `- lib
    | - __init__.py
    | - foo
    | | - __init__.py
    | `- someobject.py
    | - Helfer.py
    `- Einstellungen.py

2 Verzeichnisse, 6 Dateien

Der Befehl:

$ python import_submodule.py

Ausgabe:

settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject

# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper

print
for root, dirs, files in os.walk('.'):
    for f in fnmatch.filter(files, '*.py'):
        print "# %s/%s" % (os.path.basename(root), f)
        print open(os.path.join(root, f)).read()
        print


# lib/helper.py
print 'helper'
class Helper(object):
    def __init__(self, module_name):
        print "Helper in", module_name


# lib/settings.py
print "settings"
import helper

class Values(object):
    pass

helper.Helper(__name__)


# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper

Helper = helper.Helper


# foo/someobject.py
print "someobject"
from .. import helper

helper.Helper(__name__)


# foo/__init__.py
import someobject

59
2018-02-24 18:52



Ob lib/__init__.py definiert die Helper-Klasse und dann in settings.py können Sie verwenden:

from . import Helper

Das funktioniert weil. ist das aktuelle Verzeichnis und fungiert aus der Sicht des Einstellungsmoduls als Synonym für das lib-Paket. Beachten Sie, dass Sie den Helper nicht über exportieren müssen __all__.

(Bestätigt mit Python 2.7.10, läuft unter Windows.)


8
2018-06-30 14:27



Du legst sie einfach in __init__.py.

Also mit test / classes.py ist:

class A(object): pass
class B(object): pass

... und test / __ init__.py ist:

from classes import *

class Helper(object): pass

Sie können Test importieren und Zugriff auf A, B und Helper haben

>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>

7
2018-02-24 17:42



Edit, da ich die Frage missverstanden habe:

Stellen Sie einfach die Helper Klasse in __init__.py. Das ist perfekt Python. Es fühlt sich seltsam an, wenn man von Sprachen wie Java kommt.


4
2018-02-24 17:42



Fügen Sie so etwas hinzu lib/__init__.py

from .helperclass import Helper

Jetzt können Sie es direkt importieren:

from lib import Helper


3
2018-06-03 09:39



Ja, es ist möglich. Vielleicht möchten Sie auch definieren __all__ im __init__.py Dateien. Es ist eine Liste von Modulen, die importiert werden, wenn Sie dies tun

from lib import *

1
2018-02-24 17:49



Vielleicht könnte das funktionieren:

import __init__ as lib

-5
2018-01-04 15:09