...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.
Private Attribute
-
- 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
Aber da wird von private gesprochen...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.
Ist das was du beschrieben hast nicht protected?... ._.
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.BlackVivi hat geschrieben:Aber da wird von private gesprochen...
Auf protected könnten abgeleitete Klassen zugreifen, das ist bei __var nicht der Fall.Ist das was du beschrieben hast nicht protected?... ._.
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'
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
BlackVivi. Hatte das Reply Fenster zu lange offen, da hast du dazwischen reingeschriebenDarii hat geschrieben:Meinst du mich oder BlackVivi?mitsuhiko hat geschrieben:Nope. Das ist private.
TUFKAB – the user formerly known as blackbird
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.
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.
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...
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...
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.
- 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
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.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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?
_ = 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?
-
- 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...
Das ist aber nicht der Fall.BlackVivi hat geschrieben:Aber da wird von private gesprochen...
Ist das was du beschrieben hast nicht protected?... ._.
__ 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
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Ich finde das eine gute Beschreibung -- die technische Seite ist für viele schlicht uninteressant und verwirrt.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.
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%?
Aber nochmal zum Link zurück --> Stimmt das da nu 100%?
<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ß>lunar hat geschrieben:In Java kann – mal abgesehen von Reflection-Tricks –nur die Klasse selbst auf ein ``private`` Attribut zugreifen.
Stefan
Da sieht man mal wieder, wie lange ich schon nicht mehr mit Java programmiert habesma hat geschrieben:<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ß>lunar hat geschrieben:In Java kann – mal abgesehen von Reflection-Tricks –nur die Klasse selbst auf ein ``private`` Attribut zugreifen.