Ako na privátne funkcie / premenné v triedach

Python nepozná klúčové slovo “private” ako ho poznáme z iných jazykov ako napríklad Java alebo C++. Ak chceme zadefinovať privátnu premennú v Pythone, musí sa názov premennej začínať dvomi podtržítkami (__), to isté platí aj pre privátne funkcie. Najlepšie bude, keď si to ukážeme na príklade privátnej funkcie.

>>> class Test:
>>>     def __privatna_funkcia(self):
>>>         print('privatna_funkcia')
>>>
>>>     def info(self):
>>>         self.__privatna_funkcia()
>>>
>>> t = Test()
>>> t.info()
privatna_funkcia  

Skúsme teraz zavolať funkciu __privatna_funkcia.

>>> t.__privatna_funkcia()
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute '__privatna_funkcia'  

Ako vidíme funkciu __privatna_funkcia môžeme volať vo vnútri triedy self.__privatna_funkcia(), ale už nie z "vonka" t.__privatna_funkcia(). Poďme sa pozrieť ako to Python "zariadil", vypíšme si dostupné funkcie triedy Test.

>>> dir(t)
['_Test__privatna_funkcia', '__doc__', '__module__', 'info']

Z výpisu vidíme, že trieda "Test" obsahuje metódu _Test__privatna_funkcia, skúsme ju teraz zavolať.

>>> t._Test__privatna_funkcia()
privatna_funkcia  

Ako vidíme týmto spôsobom sa nám podarilo zavolať privátnu funkciu aj z "vonka" triedy. Z toho vyplíva, že kto bude chcieť zavolať privátnu funkciu z "vonka", tak sa mu v tom nedá úplne zabrániť. Je dobrý zvyk definovať privátne funkcie / premenné pomocou dvojitých podtržítok, minimálne tým signalizujete ďalším vývojárom, že premenná / funkcia je privátna a nie verejná.

Show Comments