Versteh ich da was falsch?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Samstag 18. November 2006, 21:34

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Samstag 18. November 2006, 22:10

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.
lunar

Samstag 18. November 2006, 23:34

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.
Antworten