w rzeczywistości (praktycznie), python nie ma nic o nazwie prywatna zmienna członkowska w Pythonie. Jednak dodanie dwóch podkreśleń (__) na początku sprawia, że zmienna lub metoda jest konwencją używaną przez większość kodu Pythona.
przyjrzyjmy się temu pojęciu na przykładzie –
privateVar1.py
Live Demo
class myClass: __privateVar = 27; def __privMeth(self): print("I'm inside class myClass") def hello(self): print("Private Variable value: ",myClass.__privateVar)foo = myClass()foo.hello()foo.__privateMeth
w powyższym programie __privMeth jest metodą prywatną, a __privateVar jest zmienną prywatną. Zobaczmy teraz jego wyjście –
wyjście
Private Variable value: 27Traceback (most recent call last): File "C:/Python/Python361/privateVar1.py", line 12, in <module> foo.__privateMethAttributeError: 'myClass' object has no attribute '__privateMeth'
z powyższego wyjścia widzimy, że poza klasą „myClass” nie można uzyskać dostępu do metody prywatnej, jak również do zmiennej prywatnej. Jednak wewnątrz klasy (myClass) możemy uzyskać dostęp do zmiennych prywatnych. W metodzie hello() można uzyskać dostęp do zmiennej __privateVar (jak pokazano powyżej: „wartość zmiennej prywatnej: 27”).
tak więc z powyższego przykładu możemy zrozumieć, że wszystkie zmienne i metody wewnątrz klasy są publiczne przez metodę. Kiedy deklarujemy dane jako prywatne, oznacza to, że są one dostępne tylko po stronie klasy i są niedostępne poza klasą. Technika tworzenia zmiennej lub metody prywatnej nazywa się maglowaniem danych. Każdy identyfikator formularza _ _ spam (co najmniej dwa znaki podkreślenia początkowego, co najwyżej jeden znak podkreślenia końcowego) jest tekstowo zastępowany przez _classname__spam, gdzie classname jest bieżącą nazwą klasy z usuniętym znakiem podkreślenia początkowego. Takie manipulowanie odbywa się bez względu na składniową pozycję identyfikatora, o ile występuje w definicji klasy.
nazwy podwójnego podkreślenia mają na celu uniknięcie przypadkowego nadpisania przez podklasę.