Zanurkuj w Pythonie/Wszystko jest obiektem
Wszystko jest obiektem
edytujWspomnieliśmy już wcześniej, że funkcje w Pythonie posiadają atrybuty, które są dostępne podczas pracy programu.
Funkcje, podobnie jak wszystko inne w Pythonie, są obiektami.
Otwórz swój ulubiony IDE Pythona i wprowadź następujący kod:
buildConnectionString
import odbchelper #(1) params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} print (odbchelper.buildConnectionString(params)) #(2) pwd=secret;database=master;uid=sa;server=mpilgrim print (odbchelper.buildConnectionString.__doc__) #(3) Tworzy łańcuch znaków na podstawie słownika parametrów. Zwraca łańcuch znaków.
- Pierwsza linia importuje program
odbchelper
jako moduł -- kawałek kodu, który możemy używać interaktywnie. (W Rozdziale 4 zobaczymy przykłady programów podzielonych na wiele modułów.) Kiedy już zaimportujemy moduł, możemy odwołać się do jego wszystkich publicznych funkcji, klas oraz atrybutów. Moduły także mogą odwoływać się do jeszcze innych modułów. - Aby wykorzystać jakąś funkcję zdefiniowaną w zaimportowanym module, musimy przed nazwą funkcji dołączyć nazwę modułu. Nie możemy napisać
buildConnectionString
, lecz zamiast tego musimy daćodbchelper.buildConnectionString
. - Tym razem zamiast wywoływać funkcję, poprosiliśmy o dostęp do jednego z jej atrybutów -- atrybut
__doc__
. W nim Python przechowuje notkę dokumentacyjną.
import w Pythonie działa podobnie jak require w Perlu. Kiedy zaimportujemy jakiś moduł, odwołujemy się do jego funkcji poprzez modul.funkcja . W Perlu wygląda to troszkę inaczej, piszemy modul::funkcja .
|
Ścieżka przeszukiwania modułów
edytujZanim przejdziemy dalej, należy wspomnieć o ścieżce przeszukiwania modułów. W Pythonie przeglądanych jest kilka miejsc w poszukiwaniu importowanego modułu. Generalnie przeszukiwane są wszystkie katalogi zdefiniowane w sys.path
. Jest to lista, którą możemy w łatwy sposób przeglądać i modyfikować w podobny sposób jak inne listy (jak to robić dowiemy się w kolejnych rozdziałach).
import sys #(1) sys.path #(2) ['', '/usr/local/lib/python2.2', '/usr/local/lib/python2.2/plat-linux2', '/usr/local/lib/python2.2/lib-dynload', '/usr/local/lib/python2.2/site-packages', '/usr/local/lib/python2.2/site-packages/PIL', '/usr/local/lib/python2.2/site-packages/piddle'] sys #(3) <module 'sys' (built-in)> sys.path.append('/my/new/path') #(4)
- Zaimportowanie modułu
sys
spowoduje, że wszystkie jego funkcje i atrybuty stają się dostępne. sys.path
to lista nazw katalogów, które są obecnie przeszukiwane podczas importowania modułu. (Zawartość listy zależna jest od systemu operacyjnego, wersji Pythona i położenia jego instalacji, więc na twoim komputerze może wyglądać nieco inaczej.) Python przeszuka te katalogi (w zadanej kolejności) w poszukiwaniu pliku .py, który nazywa się tak samo jak importowany moduł.- Właściwie to trochę rozminęliśmy się z prawdą. Sytuacja jest bardziej skomplikowana, ponieważ nie wszystkie moduły występują jako pliki z rozszerzeniem .py. Niektóre, tak jak
sys
są wbudowane w samego Pythona. Wbudowane moduły zachowują się w ten sam sposób co pozostałe, ale nie mamy bezpośredniego dostępu do ich kodu źródłowego, ponieważ nie są napisane w Pythonie (modułsys
napisany jest w C). - Kiedy dodamy nowy katalog do ścieżki przeszukiwania, Python przy następnych importach przejrzy dodatkowo dodany katalog w poszukiwaniu modułu z rozszerzeniem .py. Nowy katalog będzie znajdował się w ścieżkach szukania tak długo, jak długo uruchomiony będzie interpreter. (Dowiesz się więcej o metodzie
append
i innych metodach list w kolejnym rozdziale).
Co to jest obiekt
edytujW Pythonie wszystko jest obiektem i prawie wszystko posiada metody i atrybuty. Każda funkcja posiada wbudowany atrybut __doc__
, który zwraca napis dokumentacyjny zdefiniowany w kodzie funkcji. Moduł sys
jest obiektem, który posiada między innymi atrybut path
.
W dalszym ciągu nie wyjaśniliśmy jeszcze, co to jest obiekt. Każdy język programowania definiuje "obiekt" w inny sposób. W niektórych językach "obiekt" musi posiadać atrybuty i metody, a w innych wszystkie "obiekty" mogą dzielić się na różne podklasy. W Pythonie jest inaczej, niektóre obiekty nie posiadają ani atrybutów ani metod (więcej o tym w kolejnym rozdziale) i nie wszystkie obiekty dzielą się na podklasy (więcej o tym w rozdziale 5). Wszystko jest obiektem w tym sensie, że może być przypisane do zmiennej albo stanowić argument funkcji (więcej o tym w rozdziale 4).
Ponieważ jest to bardzo ważne, więc powtórzmy to jeszcze raz: wszystko w Pythonie jest obiektem. Łańcuchy znaków to obiekty, listy to obiekty, funkcje to obiekty, a nawet moduły to obiekty...
Materiały dodatkowe
edytuj- Python Reference Manual dokładnie opisuje, co to znaczy, że wszystko w Pythonie jest obiektem
- eff-bot podsumowuje obiekty Pythona