Na pewno nie umknęło Twojej uwadze, że w języku Python nazwy niektórych obiektów, zmiennych czy funkcji składają się z podkreśleń umieszczanych na początku, na końcu lub po obu stronach. Jest to celowy zabieg, konwencja i standard, który ma na celu uporządkowanie kodu zarówno pod względem semantycznym, funkcjonalnym jak i optycznym, czyli ułatwić jego czytanie. W dzisiejszym artykule wyjaśnię Ci jakie znaczenie mają podkreślenia w tych konkretnych przypadkach.
Czytelna nazwa zmiennej lub metody
Wymogi co do stosowania podkreśleń są jasno spisane w standardzie PEP8 – Style Guide for Python Code. PEP to zbiór dokumentów Python Enhancement Proposals. Można powiedzieć, że to takie standardy RFC dla języka programowania Python. I to właśnie w PEP8 znajdziemy wytyczne jak stosować podkreślenia.
Przede wszystkim powinniśmy stosować podkreślenia, aby nazwy obiektów były bardziej czytelne. Zapis to_jest_moja_zmienna
jest bardziej czytelny niż ToJestMojaZmienna
. Zresztą w nazwach funkcji i zmiennych nie powinniśmy używać wielkich liter, zatem to_jest_moja_zmienna
jest o wiele bardziej czytelne niż tojestmojazmienna
.
Specjalne znaczenie zmiennej w klasie
Obiektowo programować powinniśmy od samego początku. Może za wyjątkiem mikroaplikacji mieszczących się w jednym niezbyt rozbudowanym pliku. W każdym innym przypadku programowanie obiektowe nie tylko nie przeszkadza, ale i ułatwia nam tworzenie naszej aplikacji. Ale wiąże się też ze specjalnym podejściem do elementów tworzących obiekt.
class Programista: def __init__(self, imie, jezyk, doswiadczenie): self.imie = imie self._jezyk = jezyk self.__doswiadczenie = doswiadczenie
W powyższym przykładzie stworzyliśmy klasę z trzema zmiennymi. Każda z tych zmiennych jest innego typu, co rozróżniamy po liczbie podkreśleń, od których zaczyna się ich nazwa:
- Public – zmienne publiczne nie zaczynają się od żadnego podkreślenia. Jest to domyślna forma każdej zmienne w języku Python. Odwołać się do nich możemy praktycznie z każdego miejsca naszego programu.
- Protected – zmienne chronione rozpoczynamy pojedynczym podkreśleniem. Dostęp do niej mamy tylko z poziomu danej klasy oraz klas pochodnych. Pamiętajmy jednak, że w tym przypadku jest to jedynie konwencja nazewnictwa, która ma ułatwić nam odróżnienie danego typu zmiennej.
- Private – zmienne prywatne rozpoczynają się dwoma podkreśleniami. Do nich mamy dostęp jedynie z poziomu danej klasy. W przeciwieństwie do zmiennych chronionych nie jest to tylko konwencja nazewnictwa a element składni semantycznej języka. Specjalne mechanizmy wbudowane w język Python zapobiegają użyciu zmiennych prywatnych poza klasą.
Unikanie konfliktów i specjalne zastosowanie
Jest pewna bardzo przyjemna technika, która pozwala nam na unikanie konfliktów z nazwami systemowymi. Wystarczy, że dodamy na końcu pojedyncze podkreślenie.
list_ = [1, 2, 3] obiekt.funkcja(class_= 'NazwaKlasy')
W powyższych przykładach uniknęliśmy konfliktu z systemowymi nazwami dodając na końcu pojedyncze podkreślenie. Osobiście nie lubię tej metody. Wolę nazywać swoje zmienne w taki sposób by nie tworzyć potencjalnych konfliktów.
Oddzielną grupę stanowią specjalne nazwy i metody, tak zwane magic methods. Wyróżniamy je za pomocą podwójnych podkreśleń na początku i na końcu. Na pewno nie są Ci obce takie funkcje jak __init__
czy __len__
. Pierwsza to znany nam konstruktor klasy, czyli pierwsza wywoływana funkcja, gdy tworzony jest obiekt.
class A: def __init__(self): pass
Możemy tworzyć własne specjalne metody, lecz raczej co do zasady powinniśmy tego unikać, a zdefiniowane systemowo magiczne metody powinniśmy stosować zgodnie z ich przeznaczeniem opisanym w dokumentacji.
Bardzo pomocny arykuł, dzięki!