DB-Anfänger - Tabelle mit Variablen anlegen in sqlite3

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hey, das kann ich ja so nun nicht stehen lassen. Ich lese schon die Texte, die ich verlinke ;)!

Trotzdem liest sich einiges nach einer Nacht anders als in der Hitze des Arbeitstages. Auch wenn sich das Konzept in Python anders anhört, finde ich den Aufwand nur geringfügig geringer als z.B. in PHP auf private Eigenschaften zuzugreifen. Ich kann natürlich nur vergleichen, was ich kenne. Und das ist bisher an objektorientierten Sprachen PHP (jaja, ich weiss), Python und Javascript. Wenn ich denn in PHP dringend auf eine private Eigenschaft einer Klasse zugreifen müsste, muss man die Klasse ja auch nur um eine Getter-Funktion erweitern.

Letztendlich dient die Eigenschaft 'private' ja auch nur dem Programmierer, der die Klasse verwendet, zu sagen, dass er die Finger vom direkten Zugriff auf die Eigenschaft lassen soll, egal in welcher Sprache. Und mir reicht es da schon, wenn

Code: Alles auswählen

class MangleMe(object):
    def __init__(self):
        self.__mangle = 'Pfoten weg'

print mm.__mangle
print MangleMe.__mangle
print getattr(mm, '__mangle')
einen AttributeError wirft. Denn jede Methode zur Umgehung des Zugriffschutzes macht dem Programmierer doch bewusst, was er da treibt und dann sollte man sich der Konsequenzen bewusst sein.

Wenn nun ein Anfänger wie Bastil (und ich) von private schreiben, verwirren die Einwände wie "es gibt kein private in Python" mehr als das sie helfen, auch wenn aus Sicht von erfahrenen Programmieren Welten zwischen private und private liegen können. Anfänger lesen nun mal Anfängerliteratur, und wird durchaus von privaten Eigenschaften geschrieben, evt. mit dem Zusatz "weniger strikt" als in anderen Programmiersprachen.Der direkte Zugriff darauf wirft auch einen Fehler, alles funktioniert also wie gewollt. Das macht also in den Augen des Anfängers die private Eigenschaft nicht weniger privat als in PHP oder Java oder welche andere Sprache auch immer.

Denn MeinObjekt.__privat ist ja geschützt, ich muss ja schon explizit MeinObjekt._MeinObjekt__privat aufrufen, um darauf zuzugreifen. Ich verstehe den Einwand des geringeren Schutzes und Aufwandes für den Zugriff, dennoch erscheint mir der Einwand "Python hat keine privaten Attribute" für zu harsch geschrieben, bloss weil man es einfach umgehen kann. Das macht aber die Intention für den Gebrauch des Attributs nicht weniger privat als bei anderen Sprachen.

Naja, just my 2 cents
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

frabron hat geschrieben:Wenn nun ein Anfänger wie Bastil (und ich) von private schreiben, verwirren die Einwände wie "es gibt kein private in Python" mehr als das sie helfen, auch wenn aus Sicht von erfahrenen Programmieren Welten zwischen private und private liegen können. Anfänger lesen nun mal Anfängerliteratur, und wird durchaus von privaten Eigenschaften geschrieben, evt. mit dem Zusatz "weniger strikt" als in anderen Programmiersprachen.
Daher versuchen erfahrene Programmierer den Anfängern die Sachen zu erklären, so dass sie keinen Code schreiben bei dem ein erfahrener Programmierer sich an den Kopf fassen müsste.

Zudem ja die Intention von "Name Mangling" auch gar nicht "private" Attribute sind, sondern Verhinderung von Namenskollisionen. Die es eher selten gibt, daher auch der seltene Gebrauch von Name Mangling.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

@fabron
Deine Argumentation ist ziemlicher Unsinn. Klar kann man harten Zugriffsschutz umgehen, indem man einfach die Schnittstelle ändert. Genauso gut kann man auch einfach das "private" durch "public" ersetzen. Damit umgeht man den harten Zugriffsschutz aber nicht, sondern erzeugt einfach ein ungeschütztes Attribut. Trotzdem haben Sprachen wie Java, PHP oder C# einen harten, von der Sprache forcierten Zugriffsschutz.

Python hat das nicht, auch nicht doppelten Unterstrichen. Die dienen wie gesagt nur der Vermeidung von Namenskonflikten. Sie als private Attribute zu missbrauchen, ist schlechter Stil. Implementierungsdetails kennzeichnet man mit einem einfachen Unterstrich.
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Leonidas hat geschrieben:Daher versuchen erfahrene Programmierer den Anfängern die Sachen zu erklären, so dass sie keinen Code schreiben bei dem ein erfahrener Programmierer sich an den Kopf fassen müsste.
Das an den Kopf fassen lässt sich wohl nicht vermeiden :D ich bin mir sicher, dass es immer genug Gelegenheiten neben dieser private Diskussion gibt. Ich komme wieder ;)
Aber immerhin gibt mir diese Diskussion ja genug Gelegenheit, mich in dieser Angelegenheit weiterzubilden.
lunar hat geschrieben:Deine Argumentation ist ziemlicher Unsinn.
Das lasse ich jetzt mal so stehen, denn ich befürchte sehr, dass ich da mangels Wissen nicht argumentativ widersprechen kann.
Das heisst dann also, dass der Kernsatz aus der Dokumentation folgender ist:

Code: Alles auswählen

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.
und lediglich, wie ihr ja mehrfach geschrieben habt, der Vermeidung von Namenskonflikten dient und nicht der Regulierung des Zugriffes von ausserhalb der Klasse.
Vielleicht ist die Überschrift dieses Abschnittes in der Dokumentation einfach etwas doppeldeutig. Denn dieser Doppeldeutigkeit bin ja nicht nur ich auf dem Leim gegangen ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich stimme dir insofern zu, dass die Dokumentation an dieser Stelle ausgebessert werden könnte, damit sie klarer vermittelt was gemeint ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten