Próbuję zorganizować niektóre moduły na własny użytek. Mam coś takiego:
lib/
__init__.py
settings.py
foo/
__init__.py
someobject.py
bar/
__init__.py
somethingelse.py
W programie lib/__init__.py
chcę zdefiniować klasy, które będą używane podczas importowania lib. Jednak wydaje mi się, że nie mogę tego rozgryźć bez rozdzielenia klas na pliki i zaimportowania ich do formatu __init__.py
.
Zamiast mówić:
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
Chcę coś takiego:
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
Czy to możliwe, czy muszę rozdzielić klasę na inny plik?
EDYTOWAĆ
OK, jeśli zaimportuję lib z innego skryptu, mogę uzyskać dostęp do klasy pomocnika. Jak mogę uzyskać dostęp do klasy pomocnika z settings.py?
Przykładem tutaj opisuje Referencje wewnątrz opakowania. Cytuję „podmoduły często muszą odnosić się do siebie”. W moim przypadku lib.settings.py potrzebuje Helpera, a lib.foo.someobject potrzebuje dostępu do Helpera, więc gdzie powinienem zdefiniować klasę Helper?
Odpowiedzi:
lib/
Katalog nadrzędny ' ' musi znajdować się wsys.path
.Twój „
lib/__init__.py
” może wyglądać tak:Wtedy następujący przykład powinien zadziałać:
Odpowiedź na zredagowaną wersję pytania:
__init__.py
określa, jak Twój pakiet wygląda z zewnątrz. Jeśli chcesz użyćHelper
w,settings.py
zdefiniujHelper
w innym pliku, np. „lib/helper.py
”.Komenda:
Wynik:
źródło
Jeśli
lib/__init__.py
definiuje klasę Helper, to w settings.py możesz użyć:To działa, ponieważ. jest katalogiem bieżącym i działa jako synonim pakietu lib z punktu widzenia modułu ustawień. Zauważ, że nie jest konieczne eksportowanie Helpera przez
__all__
.(Potwierdzone w Pythonie 2.7.10, działającym w systemie Windows).
źródło
Po prostu umieściłeś je w __init__.py.
A więc z test / classes.py:
... i test / __ init__.py:
Możesz importować test i mieć dostęp do A, B i pomocnika
źródło
Dodaj coś takiego do
lib/__init__.py
from .helperclass import Helper
teraz możesz go zaimportować bezpośrednio:
from lib import Helper
źródło
Edytuj, ponieważ źle zrozumiałem pytanie:
Po prostu włóż
Helper
klasę__init__.py
. To całkowicie pytoniczne. Po prostu wydaje się dziwne z języków takich jak Java.źródło
Tak to mozliwe. Możesz także chcieć zdefiniować
__all__
w__init__.py
plikach. Jest to lista modułów, które zostaną zaimportowane, gdy to zrobiszźródło
Może to zadziała:
źródło