Zanurkuj w Pythonie/Funkcje prywatne

Z Wikibooks, biblioteki wolnych podręczników.

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.

Przykład. Próba wywołania metody prywatnej
>>> 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'
  1. 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 klasy MP3FileInfo 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]