Achtergrond
In klassieke objectgeoriënteerde programmering wordt encapsulatie geïmplementeerd door de toegang tot interne gegevens te beperken. In de meeste talen zijn er strikte toegangsmodifiers. In Python geldt het principe "we zijn allemaal volwassen mensen" — er is geen strikte privacy.
Probleem
Ontwikkelaars verwarren beschermde (_protected) en privé (__private) attributen en methoden in Python, denken dat "dubbele onderstreping" volledige bescherming biedt, of denken dat er helemaal geen bescherming is.
Oplossing
Python implementeert afspraken: een enkele onderstreping _var betekent beschermd, dubbele __var betekent privé (naam mangling). Toegang tot zo'n attribuut of methode is mogelijk, maar moeilijker: het wordt _ClassName__var genoemd.
Voorbeeldcode:
class Example: def __init__(self): self._protected = 1 # beschermd self.__private = 2 # privé (name mangling) ex = Example() print(ex._protected) # 1 #print(ex.__private) # AttributeError print(ex._Example__private) # 2 (name mangling)
Belangrijke kenmerken:
Kan ik via een instantie toegang krijgen tot een "privé" veld met dubbele onderstreping?
Ja, via mangling: _ClassName__var. Dus de gegevens zijn toegankelijk, gewoon niet expliciet.
Hoe gedraagt een privé methode/attribuut zich bij overerving?
Naam mangling voorkomt dat afgeleiden per ongeluk de privé elementen van de ouder overschrijven, maar toegang kan worden verkregen via _ParentClass__attr. Methoden met een dubbele onderstreping zijn niet "zichtbaar" van buiten de afgeleide klasse.
class A: def __foo(self): print("A") class B(A): def bar(self): # self.__foo() — fout self._A__foo() # werkt
Is er volledige privacy in Python zoals in JVM/C++?
Nee. Alles is gebaseerd op afspraken en mangling. Gegevens volledig beschermen is niet mogelijk, aangezien Python dynamisch toegang tot alle attributen biedt.
In een grote bibliotheek probeerde een gebruiker een privé attribuut te wijzigen via dubbele onderstreping, denkend dat dit een "geheim" was – maar via _ClassName__var vond de wijziging nog steeds plaats.
Voordelen:
Nadelen:
In een project werd afgesproken om een enkele onderstreping te gebruiken voor interne velden en ze niet buiten de klasse aan te raken. Een property werd toegevoegd voor veilige toegang.
Voordelen:
Nadelen: