Seite 1 von 1

"private" methoden und variablen

Verfasst: Samstag 8. Februar 2003, 18:30
von stevg
###

Verfasst: Samstag 8. Februar 2003, 19:51
von Dookie
Hi stevg,

echte private Varibalen gibts bei Python nicht. Du kannst aber, durch Voranstellen eines "_", "versteckte" Variablen und Mehtoden machen die bei einem dir(Classe/instanz) nicht angezeigt werden. Ansonst hilft hier nur Deine Classen gut zu Dokumentieren und in der Dokumentation genau zu beschreiben welche Variablen und Methoden öffentlich und welche nur für den internen Gebrauch bestimmt sind.


Gruß

Dookie

Verfasst: Samstag 8. Februar 2003, 20:19
von Beyond
Stimmt nicht ganz.

Soweit ich die aktuelle Python-Docu verstanden habe kann man zwei Unterstriche (also "self.__bla=0x15") verwenden. Das macht die Variable insofern private als, daß durch eine interne Namenserweiterung (der Fachterminus ist mir abhanden gekommen) ein versehentliches neudefinieren verhindert wird (ist u.U. aber nur für Methoden möglich).

Desweiteren gibt es RestictedPython, damit läßt sich auch verhindern, daß Variablen geschrieben oder ausgelesen werden können (siehe Docu).

cu beyond

Verfasst: Samstag 8. Februar 2003, 21:11
von Voges
Hallo!
Beyond hat geschrieben:(der Fachterminus ist mir abhanden gekommen)
"Name mangling" schimpft sich das und ist für alle Identifier innerhalb einer Klasse anwendbar, soweit ich das verstanden habe. Näheres im Tutorium Punkt 9.6 und im Reference Manual Punkt 5.2.1
Jan

zänk ju

Verfasst: Sonntag 9. Februar 2003, 12:52
von stevg
ok. danke erstmal. werd mir da mal anschauen.
aber ich find das die entwickler von python dieses problem nicht gut gelöst haben.
genau so wenn ich liste1 = liste2 schreibe das dann keine copy sondern eine referenz auf liste2 angelegt wird (ist doch mist)

Verfasst: Sonntag 9. Februar 2003, 14:14
von Dookie
Hi stevg,
stevg hat geschrieben:ok. danke erstmal. werd mir da mal anschauen.
aber ich find das die entwickler von python dieses problem nicht gut gelöst haben.
genau so wenn ich liste1 = liste2 schreibe das dann keine copy sondern eine referenz auf liste2 angelegt wird (ist doch mist)
Also ich brauche keine privaten Variablen oder Methoden in meinen Modulen, wenn eine Variable nur mittels Methoden der Klasse manipuliert werden dürfen, so schreibe ich das in den docstring, wenns dann einer trotzdem anders macht, darf er sich nicht wundern, wenns mit einer neueren Version des Moduls dann nicht mehr funktioniert.

Nö das ist kein misst, sondern spart unheimlich Performance und Speicher. Für eine Kopie kannst du ja einfach schreiben liste2 = liste1[:]. In 99% aller Fälle reicht es aber auf den Inhalt einer Liste zugreiffen zu können ohne mit einer Kopie zu arbeiten.


Gruß

Dookie

mh

Verfasst: Montag 10. Februar 2003, 09:08
von stevg
ok. das mit den listen sehe ich ein. aber ich hab hier irgendwo mal im forum gelesen das python eine erwachsene sprache seinsoll, aber ich finde bei einer erwachsenen sprache müssten private klassen selbstverständlich sein.
ich finds nur komisch - wenn man in c++ oder java eine variable oder eine methode, die nur für den interenen gebrauch ist, nicht privat setzt wird mann gleich zu geprellt, dass das unsaubere programmierung sei. und hier bei euch ist es egal, wenn man das ausführlich dokumentiert hat.

Verfasst: Montag 10. Februar 2003, 16:04
von Mickey
Ich weiß nicht, wo Dein Problem ist. Private Klassen sagen im Wesentlichen einfach nur aus: "Dies ist ein Implementierungsdetail. Wenn Du Dich hierauf verlässt, dann bist Du verlassen.". Und das ist in C++ nicht anders - denn auch dort kann man diese vermeintliche Restriktion umgehen. Wer ein

Code: Alles auswählen

#define private protected
#include <blabla.h>
#undef private
macht und nicht genau weiss, was er tut, gehört einfach bestraft. Wenn ich in Python nicht faul bin und Akzessoren (get(), set()-Methoden) bereitstelle und alle anderen Attribute mit _ prefixe, dann sind diese Attribute genauso privat wie in anderen Sprachen auch.

Verfasst: Montag 29. Oktober 2007, 22:21
von markus_u
Da dieses Thema doch ab und an über Google gefunden wird, hier der Link, dass es mit ein wenig Arbeit doch geht:

http://aspn.activestate.com/ASPN/Cookbo ... ipe/496920

Dennoch stimmt es, dass man einfach die API richtig lesen sollte ;)