"private" methoden und variablen

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
stevg

###
Zuletzt geändert von stevg am Donnerstag 11. Dezember 2008, 14:42, insgesamt 1-mal geändert.
Dookie
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
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

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
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
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)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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

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.
Gruß,

:M:
markus_u
User
Beiträge: 3
Registriert: Dienstag 9. Oktober 2007, 13:39

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 ;)
Antworten