Seite 1 von 1

Versteh ich da was falsch?

Verfasst: Samstag 18. November 2006, 21:34
von rolgal_reloaded
Hallo zusammen,

Weigend erklärt in Python GE-PACKT S. 226 (hab nicht die aktuellste Ausgabe)
Stark private Attribute haben Namen, die mit zwei Unterstrichen beginnen.......Es ist nur möglich, innerhalb einer Methode eines Objekts dieser Klasse auf ein solches Attribut zugreifen.........
Er führt dann ein Codebeispiel an bei dem ein Zugriff mit objekt.__attribut natürlich auch versagt.

Meine Frage, hat er folgendes tatsächlich übersehen, oder weil die Art dieses Zugriffs der sehr wohl möglich ist, semantisch ganz anders aufzufassen ist, zu Recht weggelassen:


Code: Alles auswählen

      
>>> class Privat:
	def __init__(self):
		self.__ganzprivat=1
		self._privat=2
		self.oeffentlich=3

		
>>> privat=Privat()

>>> privat.oeffentlich
3
>>> privat._privat
2
>>> privat.__ganzprivat   # so gehts freilich nicht

Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    privat.__ganzprivat
AttributeError: Privat instance has no attribute '__ganzprivat'
>>> privat._Privat__ganzprivat # so gehts natürlich
1
>>> privat._Privat__ganzprivat=4 # und einen neuen Wert setzen geht auch
>>> privat._Privat__ganzprivat
4

Liebe Grüße

rolgal_reloaded

Verfasst: Samstag 18. November 2006, 22:10
von birkenfeld
Möglich, dass er es übersehen hat.
Meiner Meinung nach ist das Ganze eher unpraktisch und war ja sowieso nur dazu gedacht, Kollisionen von privaten Variablennamen in Klassenhierarchien zu verhindern.

Re: Versteh ich da was falsch?

Verfasst: Samstag 18. November 2006, 23:34
von lunar
rolgal_reloaded hat geschrieben: Meine Frage, hat er folgendes tatsächlich übersehen, oder weil die Art dieses Zugriffs der sehr wohl möglich ist, semantisch ganz anders aufzufassen ist, zu Recht weggelassen:
Ich denke nicht, dass der Autor das übersehen hat. Allerdings hat er es wohl mit Absicht unterschlagen, da derartiger Zugriff auf private Argumente sehr, sehr hässlich ist und in ordentlichem Code nichts zu suchen hat.

Aus Sicht des Anwenders ist klasse._feld und klasse.__feld das selbe: Beide Felder können zwar mutwillig von Außen geändert werden. Das ist aber auch beabsichtigt, u.a. um Debuggern leichten Zugriff auf solche Felder zu gewähren. In diesem Punkt vertraut Python auf die Intelligenz des Programmierers, entsprechende Zugriffe im Sinne der Lesbarkeit des Codes zu unterlassen...
Der Unterschied besteht allein darin, dass die zweite Variante - wie bereits gesagt - unter Einbeziehung des Klassenamens eindeutig benannt wird, um Namenskonflikte bei Vererbungshierachien zu vermeiden. Dadurch wird verhindert, dass der Programmierer einer abgeleiteten Klasse versehentlich private Variablen der Vaterklasse überschreibt, was unter Umständen zu seltsamen Verhalten führen könnte.