Zanurkuj w Pythonie/Pakiety: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
mNie podano opisu zmian |
przetłumaczone |
||
Linia 1:
{{Podświetl|py}}
== Pakiety ==
Linia 6 ⟶ 4:
W rzeczywistość przetwarzanie dokumentu XML jest bardzo proste, wystarczy jedna linia kodu. Jednakże, zanim dojdziemy do tej linii kodu, będziemy musieli krótko omówić, czym są pakiety.
'''Przykład 9.5. Ładowanie dokumentu XML
>>> from xml.dom import minidom #(1)
Linia 17 ⟶ 15:
'''Przykład 9.6. Plikowa struktura pakietu'''
<span>Python21/
|
+−−lib/
|
+−− xml/ xml
|
+−−sax/ xml.sax
|
+−−dom/ xml.dom
|
+−−parsers/ xml.parsers
Dlatego kiedy powiesz <tt>from xml.dom import minidom</tt>, Python zrozumie to jako "znajdź w katalogu <tt>xml</tt> katalog <tt>dom</tt>, a następnie szukaj tutaj modułu <tt>minidom</tt> i zaimportuj go jako <tt>minidom</tt>". Lecz Python jest także mądrzejszy; nie tylko możesz zaimportować cały moduł zawarty wewnątrz pakietu, ale także możesz wybiórczo zaimportować wybrane klasy czy funkcje z modułu znajdującego się wewnątrz pakietu. Możesz także zaimportować sam pakiet jako moduł. Składnia będzie taka sama; Python wywnioskuje, co masz na myśli na podstawie struktury plików pakietu i automatycznie wykona poprawną czynność.
Linia 55 ⟶ 53:
# Tutaj importujemy jako główny poziom pakietu <tt>xml</tt>.
Więc jak może pakiet (który na dysku jest katalogiem) zostać zaimportowany i traktowany jako moduł (a który jest zawsze plikiem na dysku)? Odpowiedzią jest magiczny plik <tt>__init__.py</tt>. Widzimy, że pakiety nie są po prostu katalogami. Są one katalogami ze specyficznym plikiem wewnątrz, <tt>__init__.py</tt>. Plik ten definiuje atrybuty i metody tego pakietu. Na przykład, <tt>xml.dom</tt> posiada klasę <tt>Node</tt>, która jest zdefiowana w <tt>xml/dom/__init__.py</tt>. Kiedy importujesz pakiet jako moduł (np. <tt>dom</tt> z <tt>xml</tt>-a), to tak naprawdę importujesz jego plik <tt>__init__.py</tt>.
{{Infobox|
Pakiet jest katalogiem ze specjalnym plikiem <tt>__init__.py</tt> wewnątrz niego. Plik <tt>__init__.py</tt> definiuje atrybuty i metody pakietu. Nie musi on definiować niczego, może być nawet pustym plikiem, lecz musi istnieć. Jeśli nie istnieje plik <tt>__init__.py</tt>, katalog jest tylko katalogiem, a nie pakietem, więc nie może być zaimportowany lub zawierać moduły, czy też zagnieżdżone pakiety.
}}
Więc dlaczego męczyć się z pakietami? Umożliwiają one logiczne pogrupowanie powiązanych ze sobą modułami. Zamiast stworzenia pakietu <tt>xml</tt> z wewnętrznymi pakietami <tt>sax</tt> i <tt>dom</tt>, autorzy mogliby umieścić całą funkcjonalność <tt>sax</tt> w <tt>xmlsax.py</tt>, a całą funkcjonalność <tt>dom</tt> w <tt>xmldom.py</tt>, czy też nawet zamieścić wszystko w pojedyńczym module. Jednak byłoby to niewygodne (podczas pisania tego podręcznika pakiet <tt>XML</tt> posiadał prawie 6000 linii kodu) i trudne w zarządzaniu
(dzięki oddzielnym plikom źródłowym, wiele osób może równocześnie pracować nad różnymi częściami).
Jeśli kiedykolwiek będzie planował napisać wielki podsysten w Pythonie (lub bardziej prawdopodobnie, kiedy zauważysz, że twój mały podsystem rozrósł się do dużego), zainwestuj trochę czasu na zaprojektowanie dobrej architektury systemu pakietów. Jest to jedna z wielu rzeczy w Pythonie, w którym jest dobry, więc skorzystajmy z tej zalety.
<noinclude>
|