Zanurkuj w Pythonie/Wszystko jest obiektem

Wszystko jest obiektem

edytuj

Wspomnieliś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:

Przykład. Dostęp do notki dokumentacyjnej funkcji 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.

  1. 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.
  2. 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.
  3. 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ą.

Ścieżka przeszukiwania modułów

edytuj

Zanim 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).

Przykład. Ścieżka przeszukiwania modułów
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)
  1. Zaimportowanie modułu sys spowoduje, że wszystkie jego funkcje i atrybuty stają się dostępne.
  2. 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ł.
  3. 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 syswbudowane 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).
  4. 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

edytuj

W 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