PublicPrivateMechanismus

Einen public/private-Mechanismus wie bei Ruby oder C++ gibt es in Python nicht.

Es gibt in Python keine privaten Attribute oder Methoden. Wenn du eine Funktion oder eine Variable als privat deklarieren möchtest, dann stell dem Funktionsnamen einfach einen Unterstrich voran. Damit weiß jeder: "Finger weg!". Das ist eine allgemeine Konvention.

Die "private"-Deklaration in C++ lässt sich leicht umgehen, s. Datenattribute und Properties ausgeben. Warum soll man sich so ein System zusammen basteln? Außerdem hat Python eine schöne Art, Eigenschaften zu kapseln, sodass das eigentliche Argument für private Variablen wegfällt. Falls man es doch braucht: es gibt noch den Unterstrich.

Beispiel

   1 # -*- coding: UTF-8 -*-
   2 
   3 class PrivatTest:
   4     def __init__(self):
   5         self.oeffentlich = 3
   6         self._privat = 2
   7         self.__ganzprivat = 1
   8 
   9 t = PrivatTest()
  10 print "dir:", dir(t)
  11 
  12 print "\n\nZugriff auf öffentliche und schwach private Variablen:"
  13 print "-"*79
  14 
  15 print "t.oeffentlich:", t.oeffentlich
  16 print "t._privat:", t._privat
  17 
  18 print "\n\nZugriff auf stark private Variablen:"
  19 print "-"*79
  20 
  21 try:
  22     print t.__ganzprivat
  23 except AttributeError, e:
  24     print "print t.__ganzprivat Fehler:"
  25     print e
  26 
  27 print "\n\nMit etwas Magie geht der Zugriff dennoch:"
  28 print "-"*79
  29 
  30 print "t._PrivatTest__ganzprivat:", t._PrivatTest__ganzprivat
  31 
  32 # Den Wert ändern, geht auch so:
  33 t._PrivatTest__ganzprivat = "neuer Wert!"
  34 
  35 print "t._PrivatTest__ganzprivat:", t._PrivatTest__ganzprivat

Ausgaben:

dir: ['_PrivatTest__ganzprivat', '__doc__', '__init__', '__module__', '_privat', 'oeffentlich']


Zugriff auf öffentliche und schwach private Variablen:
-------------------------------------------------------------------------------
t.oeffentlich: 3
t._privat: 2


Zugriff auf stark private Variablen:
-------------------------------------------------------------------------------
print t.__ganzprivat Fehler:
PrivatTest instance has no attribute '__ganzprivat'


Mit etwas Magie geht der Zugriff dennoch:
-------------------------------------------------------------------------------
t._PrivatTest__ganzprivat: 1
t._PrivatTest__ganzprivat: neuer Wert!

Links

PublicPrivateMechanismus (last edited 2009-06-17 16:14:16 by localhost)