Zanurkuj w Pythonie/Funkcje prywatne
Funkcje prywatne
[edytuj]Jak większość języków programowania, Python posiada koncepcję elementów prywatnych:
- prywatne funkcje, które nie mogą być wywoływane spoza modułów w których są zdefiniowane
- prywatne metody klas, które nie mogą być spoza nich wywołane
- prywatne atrybuty do których nie ma dostępu spoza klasy
Inaczej niż w większości języków, to czy element jest prywatny, czy nie, zależy tylko od jego nazwy.
Jeżeli nazwa funkcji, metody czy atrybutu zaczyna się od dwóch podkreśleń (ale nie kończy się nimi), to wtedy element ten jest prywatny, wszystko inne jest publiczne. Python nie posiada koncepcji chronionych metod (tak jak na przykład w Javie, C++, które są dostępnych tylko w tej klasie oraz w klasach z niej dziedziczących). Metody mogą być tylko prywatne (dostępne tylko z wnętrza klasy), bądź publiczne (dostępne wszędzie).
W klasie MP3FileInfo
istnieją tylko dwie metody: __parse
oraz __setitem__
. Jak już zostało przedstawione, __setitem__
jest metodą specjalną: zostanie wywołana, gdy skorzystamy ze składni dostępu do słownika bezpośrednio na instancji danej klasy. Jednak ta metoda jest publiczna i można ją wywołać bezpośrednio (nawet z zewnątrz modułu fileinfo
), jeśli istnieje jakiś dobry do tego powód. Jednak metoda __parse
jest prywatna, ponieważ posiada dwa podkreślenia na początku nazwy.
W Pythone wszystkie specjalne metody (takie jak __setitem__ ) oraz wbudowane atrybuty (np. __doc__ ) trzymają się standardowej konwencji nazewnictwa. Ich nazwy zaczynają się oraz kończą dwoma podkreśleniami. Nie nazywajmy własnych metod w ten sposób, bo jeśli tak będziemy robić, możemy wprawić w zakłopotanie nie tylko siebie, ale i inne osoby czytające nasz kod później.
|
>>> import fileinfo
>>> m = fileinfo.MP3FileInfo()
>>> m.__parse("/music/_singles/kairo.mp3") #(1)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'MP3FileInfo' object has no attribute '__parse'
- Jeśli spróbujemy wywołać prywatną metodę, Python rzuci nieco mylący wyjątek, który informuje, że metoda nie istnieje. Oczywiście istnieje ona, lecz jest prywatna, więc nie jest możliwe uzyskanie dostępu do niej spoza klasy. Ściśle mówiąc, metody prywatne są dostępne spoza klasy w której były zdefiniowane, jednak nie w taki prosty sposób. Tak naprawdę nic w Pythonie nie jest prywatne, nazwy metod prywatnych są kodowane oraz odkodowane "w locie", aby wyglądały na niedostępne, gdy korzystamy z ich prawdziwych nazw. Możemy jednak wywołać metodę
__parse
klasyMP3FileInfo
przy pomocy nazwy_MP3FileInfo__parse
. Informacja ta jest dosyć interesująca, jednak obiecajmy sobie nigdy nie korzystać z niej w prawdziwym kodzie. Metody prywatne są prywatne nie bez powodu, lecz jak wiele rzeczy w Pythonie, ich prywatność jest kwestią konwencji, nie przymusu.
Materiały dodatkowe
[edytuj]- Python Tutorial omawia działanie prywatnych zmiennych od środka