Private Attribute

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
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

...bin ich jetzt blöd oder was?...

Also, nun ehrlich! Ich dachte immer Python hätte nichts mit Geheimnisprinzip am Hut oder so, aber warum steht das in diesem einem Buch und jetzt auch noch dort:

http://de.wikibooks.org/wiki/Python-Pro ... nd_Klassen

Bin verwirrt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Das ist auch nicht Geheimnisprinzip sondern ein sehr schlaues Feature. Stell dir vor du hast eine Mixin Klasse, die Caching in irgendeine Klasse einbaut und da musst du einen Cache wo ablegen. Und zwar so, dass er mit der Klasse nicht kollidiert. Dafür kann man das zb nutzen.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

mitsuhiko hat geschrieben:Das ist auch nicht Geheimnisprinzip sondern ein sehr schlaues Feature. Stell dir vor du hast eine Mixin Klasse, die Caching in irgendeine Klasse einbaut und da musst du einen Cache wo ablegen. Und zwar so, dass er mit der Klasse nicht kollidiert. Dafür kann man das zb nutzen.
Aber da wird von private gesprochen...

Ist das was du beschrieben hast nicht protected?... ._.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

BlackVivi hat geschrieben:Aber da wird von private gesprochen...
Ja, das ist falsch -- wen du es im Sinne eines Java "private" siehst. Versteckt würde es besser treffen, du kannst sie natürlich trotzdem noch benutzen und überschreiben.
Ist das was du beschrieben hast nicht protected?... ._.
Auf protected könnten abgeleitete Klassen zugreifen, das ist bei __var nicht der Fall.

Code: Alles auswählen

>>> class A:
...     __projected = "Hallo Welt!"
... 
>>> class B(A): 
...     def __init__(self):
...         print self.__protected
... 
>>> B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
AttributeError: B instance has no attribute '_B__protected'
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Nope. Das ist private.
TUFKAB – the user formerly known as blackbird
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

mitsuhiko hat geschrieben:Nope. Das ist private.
Meinst du mich oder BlackVivi?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Darii hat geschrieben:
mitsuhiko hat geschrieben:Nope. Das ist private.
Meinst du mich oder BlackVivi?
BlackVivi. Hatte das Reply Fenster zu lange offen, da hast du dazwischen reingeschrieben :)
TUFKAB – the user formerly known as blackbird
lunar

Er meint wohl dich.

In Java kann – mal abgesehen von Reflection-Tricks –nur die Klasse selbst auf ein ``private`` Attribut zugreifen. ``protected`` Attribute sind zwar ebenfalls nicht Bestandteil der öffentlichen API einer Klasse, allerdings für abgeleitete Klassen verfügbar.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Hm, dann hab ich das falsch verstanden =/

Dachte immer: Mit einem Unterstrich is's private... Aber nicht technisch, sondern aus programmierersicht. Funktionen und sowas mit nur einem Unterstrich sollte man nicht verwenden, wenn nur als Entwickler von dem Modul!

Und mit doppelten Unterstrich kann man Methoden nicht wirklich überschreiben. Wenn man's tut, wird's halt aufgeteilt zwischen _klasse1__funktion und _abgeleitetefunktion__funktion... Zumindest grade, als ich es getestet habe. Aber das ist doch nicht so wie bei Java... Aber im Tut dort wird's aber so beschrieben, als wenn man dann von außen nicht mehr drauf zugreifen kann. Find' das halt alles verwirrend oO

Vielleicht klärt mich jemand auf...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Also ich finde, das ist im Tutorial ziemlich klar beschrieben. Ich zitiere mal:
9.6 Private Variables
There is limited support for class-private identifiers. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, so it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes. Truncation may occur when the mangled name would be longer than 255 characters. Outside classes, or when the class name consists of only underscores, no mangling occurs.
Name mangling is intended to give classes an easy way to define ``private'' instance variables and methods, without having to worry about instance variables defined by derived classes, or mucking with instance variables by code outside the class. Note that the mangling rules are designed mostly to avoid accidents; it still is possible for a determined soul to access or modify a variable that is considered private. This can even be useful in special circumstances, such as in the debugger, and that's one reason why this loophole is not closed. (Buglet: derivation of a class with the same name as the base class makes use of private variables of the base class possible.)
Notice that code passed to exec, eval() or execfile() does not consider the classname of the invoking class to be the current class; this is similar to the effect of the global statement, the effect of which is likewise restricted to code that is byte-compiled together. The same restriction applies to getattr(), setattr() and delattr(), as well as when referencing __dict__ directly.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Manchmal ist die technische Erklärung nicht die ideale Erklärung. Ich vermittle gerne:

- *Ein* Unterstrich (_) ist ein Hinweis, dass dieses Attribut nicht von außerhalb verwendet werden soll, ausgenommen man weiß was man tut.

- *Zwei* Unterstriche (__) bedeutet: Don´t touch this! Außerdem hat diese Schreibweise den Nutzen, dass dieses Attribut nicht unabsichtlich überschrieben werden kann. Was für die gezielte Entwicklung von Modulen für die Allgemeinheit genutzt werden kann, aber in den eigenen Modulen kaum Sinn macht.

Zumindest halte ich das für einfacher und vermittelbarer als "privat", "protected", "friend", "public" und Co.
Natürlich mache ich mir damit keine Freunde bei den Sprachextremisten.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Also war das, was ich geschrieben habe, doch nicht falsch...

_ = interne Benutzung
__ = NICHT ANFASSEN + unüberschreibbar

Aber limitiert wird der Pythonbenutzer nicht... Wir sind ja keine Kinder ;P


Was mich halt stört... Irgendwie passt die Beschreibung aus meinem Link doch dann nicht, oder?
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackVivi hat geschrieben:Also war das, was ich geschrieben habe, doch nicht falsch...
BlackVivi hat geschrieben:Aber da wird von private gesprochen...

Ist das was du beschrieben hast nicht protected?... ._.
Das ist aber nicht der Fall.

__ ist private und _ ist "soft protected", dh sieh es als protected an, auch wenn es das nicht ist.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

gerold hat geschrieben:- *Ein* Unterstrich (_) ist ein Hinweis, dass dieses Attribut nicht von außerhalb verwendet werden soll, ausgenommen man weiß was man tut.

- *Zwei* Unterstriche (__) bedeutet: Don´t touch this! Außerdem hat diese Schreibweise den Nutzen, dass dieses Attribut nicht unabsichtlich überschrieben werden kann. Was für die gezielte Entwicklung von Modulen für die Allgemeinheit genutzt werden kann, aber in den eigenen Modulen kaum Sinn macht.
Ich finde das eine gute Beschreibung -- die technische Seite ist für viele schlicht uninteressant und verwirrt.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Auf jedenfall danke. Dann hab ich eher private und protected aus Java nicht richtig verstanden als das System aus Python...

Aber nochmal zum Link zurück --> Stimmt das da nu 100%?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

lunar hat geschrieben:In Java kann – mal abgesehen von Reflection-Tricks –nur die Klasse selbst auf ein ``private`` Attribut zugreifen.
<klugscheiß>Code in Methoden in inneren Klassen kann auch auf die private Felder und Methoden aller äußeren Klassen zugreifen. Und Klassen greifen auf gar nichts zu... :)</klugscheiß>

Stefan
lunar

sma hat geschrieben:
lunar hat geschrieben:In Java kann – mal abgesehen von Reflection-Tricks –nur die Klasse selbst auf ein ``private`` Attribut zugreifen.
<klugscheiß>Code in Methoden in inneren Klassen kann auch auf die private Felder und Methoden aller äußeren Klassen zugreifen. Und Klassen greifen auf gar nichts zu... :)</klugscheiß>
Da sieht man mal wieder, wie lange ich schon nicht mehr mit Java programmiert habe ;)
Antworten