Prüfen der Internetverbindung

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

Hallo BlackJack,

die Attribute mit zwei führenden Unterstrichen verwirren mich noch etwas. Auf dieser Seite (http://www.python-kurs.eu/klassen.php) ziemlich weiter unten unter der Überschrift Datenkapselung steht, dass Attribute, deren Name mit __ beginnen, privat sind, sodass man auf sie nicht von außen zugreifen kann. So werden sie auch im darunterstehenden Beispiel verwendet. Dies habe ich mit folgendem Code ausprobiert, der das auch bestätigt:

Code: Alles auswählen

class Neu(object):
    def __init__(self, attr):
        self.__attr = attr

a = Neu(5)
print a.__attr
Was meinst du damit, dass man auf diese Attribute dennoch von außen zugreifen kann? Sirius3 schrieb im anderen Thread ebenfalls, dass doppelte Unterstriche nichts in einem Programm ohne Mehrfachvererbung zu suchen haben, was aber offensichtlich nicht die Verwendung ist, die auf der oben verlinkten Seite angewendet wird. Sollte man es so also generell nicht machen, sondern lediglich protected-Variablen mit einem führenden Unterstrich verwenden, um zu signalisieren "normalerweise nicht verändern"?
BlackJack

@S0S: Es gibt in Python weder ”private” noch ”protected”, das ist verwirrend in dem Zusammenhang diese Begriffe zu verwenden, die eine recht feste Bedeutung haben. Quellen die so etwas behaupten, sollte man mit Vorsicht geniessen. Nur weil etwas im Internet steht, muss es nicht wahr sein. ;-)

Nochmal: Doppelte führende Unterstriche machen nichts ”private”. Die Attribute sind weiterhin öffentlich verfügbar, nur unter einem anderen Namen um Namenskollisionen, zum Beispiel bei Mehrfachvererbung zu vermeiden:

Code: Alles auswählen

In [5]: class Neu(object):
   ...:         def __init__(self, attr):
   ...:                 self.__attr = attr
   ...: 

In [6]: a = Neu(5)

In [7]: a._Neu__attr
Out[7]: 5
Das Muster nach dem der Name verändert wird ist dokumentiert, es ist also kein Problem darauf zuzugreifen. Es verhindert bei Mehrfachvererbung mit zwei Klassen die den gleichen Attributnamen, aber für unterschiedliche Zwecke verwenden, dass diese Namen kollidieren, weil sie sich durch den jeweiligen Klassennamen unterscheiden, der hinzugefügt wurde. (Allerdings kann einem dann immer noch auf die Füsse fallen wenn es weiter oben in der Vererbungshierarchie eine Weitere Klasse mit dem gleichen Namen und Attribut gibt dem zwei Unterstriche vorangestellt sind. :-))

Ein Unterstrich sagt nicht ”normalerweise nicht verändern”, sondern generell nicht zugreifen. Jedenfalls solange man nicht weiss was man tut, oder bereit ist die Risiken zu tragen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@S0S: nicht alles, was auf irgendwelchen Seiten steht, muß stimmen. Es gibt in Python keinen Zugriffsschutz, also sind Bezeichnungen wie protected oder private einfach nur falsch. _name heißt nur, dass man nicht von außen zugreifen soll, nicht mal lesend.

Die erste Frage, die sich mir bei Deinem Programm stellt, ist ja die, warum es da überhaupt eine GUI gibt.
Die Funktionalität sollte idealerweise auch ohne GUI funktionieren.

Du hast nur «global» definierte Variablen durch mit »self.« eingeleitete ersetzt. Eine Gott-Klasse ist genauso unübersichtlich, wie globale Variablen zu verwenden. Das ist nicht nur Ideologie, sondern sorgt dafür, dass Programme lesbar, wartbar und testbar bleiben.
S0S
User
Beiträge: 50
Registriert: Samstag 9. Februar 2013, 18:59

Ok, ich merke mir, dass der doppelte Unterstrich für etwas ganz anderes gedacht ist als das "Verstecken" von Attributen und ich ihn, sofern ich nicht mit Vererbung arbeite, was ich bisher noch nie getan habe, nicht verwende. Der einfache Unterstrich tut das, was ich auch dachte, also vom Programm her gar nichts, aber es ist eine Konvention, auf derartige Attribute nicht direkt zuzugreifen.

Die GUI habe ich in das Programm eingeführt, da ich eine Möglichkeit gesucht habe, beim Beenden der Schleife zu einem Zeitpunkt, den ich selbst bestimme, noch Befehle auszuführen (konkret: die Gesamtzahl der online- und offline-Minuten berechnen und in die Datei schreiben). Für die Entscheidung "Wenn ich nichts tue, führe die Schleife weiter aus, wenn ich etwas tue (klicken oder auch irgendeine Eingabe), beende die Schleife und mache das." habe ich keine nicht-gui-basierte Möglichkeit der Umsetzung gefunden, sondern bin nur immer wieder auf die after-Methode gestoßen.
Antworten