"private" methoden und variablen
###
Zuletzt geändert von stevg am Donnerstag 11. Dezember 2008, 14:42, insgesamt 1-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
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
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
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
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
Hallo!
Jan
"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.1Beyond hat geschrieben:(der Fachterminus ist mir abhanden gekommen)
Jan
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)
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)
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi stevg,
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
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.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)
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
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.
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.
-
- User
- Beiträge: 22
- Registriert: Donnerstag 29. August 2002, 00:34
- Wohnort: Frankfurt am Main
- Kontaktdaten:
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
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.
Code: Alles auswählen
#define private protected
#include <blabla.h>
#undef private
Gruß,
:M:
:M:
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
http://aspn.activestate.com/ASPN/Cookbo ... ipe/496920
Dennoch stimmt es, dass man einfach die API richtig lesen sollte
