
Wenn man wirklich einen Tresor hat, sind andere Mittel gefragt als der Zugriffsschutz, den die üblichen Programmiersprachen bieten.
Also Seköriti by obsköriti?burli hat geschrieben:Das Schutzmaßnahmen ausgehebelt werden können ist bekannt. Erst kürzlich habe ich gesehen das man sogar relativ einfach an die Daten verschlüsselter Festplatten kommt.
Aber man muss sie auch nicht gleich auf dem Präsentierteller anbieten
Was ich mir selbst immer wieder hinter die Ohren schreibe ist, dass man getter() und setter() selten braucht. Ich bin meistens nur zu faul, das auch einzusehen. "Private" Klassenkameraden verwende ich, um auch mir selbst etwas Übersicht im Quelltext zu geben: Eine _private Methode ist nur für den (Klassen-) internen Gebrauch, ein __sehr_privates Attribut birgt beim Zugriff die Gefahr von Seiteneffekten. (Den ersten Teil davon habe ich aus PEP 8 )burli hat geschrieben: Das wollte ich noch fragen. Was ist an Settern und Gettern und private members so schlecht?
Die Schnittstellen sind doch auch ohne Information Hiding da, nicht wahr? Schnittstellen definieren ja welche Protokolle vom Objekt unterstützt werden, nicht was nicht unterstützt wird.Marky hat geschrieben:Wenn ich zwei Softwaremodule habe, die miteinander kommunizieren, dann geht das normalerweise über Schnittstellen nach außen hin (Information Hiding).
Wenn ich einen Anhänger ans Auto dranhänge, mache ich den auch nicht an einem Esel fest und binde den Esel am hinteren Scheibenwischer fest. Aber wo hat dein Vergleich irgendeine Ähnlichkeit mit OOP in Python?Marky hat geschrieben:Wenn ihr an euer Auto einen Anhänger dranhängt, dann macht ihr den doch auch an der Anhängerkupplung fest und öffnet nicht den Kofferraum und legt die Deichsel auf den Rücksitz?!
Wer sagt denn dass Datenkapselung syntaktische Unterstützung braucht? Datenkapselung in Python kannst du ja auch implizit sehen, so wie Interfaces auch. Dir werden eben weniger Hürden vor die Beine geworfen um die Datenkapselung aufzubrechen. In Java könntest du über Reflection die Kapselung überwinden, in Python über den Zugriff auf Attribute die mit ``_`` beginnen.Marky hat geschrieben:Dass in Python nichts wirklich private ist, ist ja ok und eben sprachabhängig, aber verändert das dann auch den Sinn von Datenkapselung ... ???
Das sagt niemand, nur finde ich syntaktische Unterstützung nicht verwerflich und sie zu nutzen auch nicht. Wenn alles nur aus Konventionen besteht, dann ist es leichter diese zu verletzen, als wenn man die syntaktisch Hürde überwinden muss. Ich meine, eine gewisse Hürde gibts ja in Python auch, nur verstehe ich eben solche Aussagen nicht, dass man das nicht oder kaum braucht usw ... Das ist ja dann eine Frage des Programmierstils und nicht unbedingt eine Frage guten Designs.Wer sagt denn dass Datenkapselung syntaktische Unterstützung braucht? Datenkapselung in Python kannst du ja auch implizit sehen, so wie Interfaces auch. Dir werden eben weniger Hürden vor die Beine geworfen um die Datenkapselung aufzubrechen. In Java könntest du über Reflection die Kapselung überwinden, in Python über den Zugriff auf Attribute die mit ``_`` beginnen.
Das kann man in Java eben nicht so einfach. In Python ist es kein Problem die Funktionsweise von Attributen zu ändern ohne das Interface zu verändern. Das geht in Java nicht.Marky hat geschrieben:Es ist sicherlich viel Ansichtssache bei dem Thema, aber in Java kann ich auch alles public machen ... Es ist nur eben die Frage, ob das OO-technisch dann noch Sinn macht.
Code: Alles auswählen
class Person:
name = "Hans Mustermann"
p = Person()
p.name = "Max Müller"
# nun möchte man beim setzen des Attributs noch etwas machen
class Person:
_name = "Hans Mustermann"
@property
def name(self):
return self._name
@name.setter
def name(self, name)
self._name = name
self.anrede = "Herr"
# Das Interface nach außen ist gleich geblieben
# In Java müsste man name private machen und
# getter und setter einführen, das würde das Interface
# aber ändern.
p = Person()
p.name = "Max Müller"
Dagegen spricht ja auch nichts es geht den meisten auch nur damit, dass man nicht alles private machen muss "weil sich das halt so gehört" bei einem, von trivialen gettern hat auch niemand was.nur finde ich, dass es mind. genausoviel Sinn macht, die Möglichkeit zu nutzen, per Codierung (Syntax) klar zu machen, dass keiner in die Internas greifen soll, als es durch Konvention festzulegen. Hoffentlich hält sich dann jeder dran.
Ja, stimmt. Gibt es aber nicht, also kann es wohl nicht verwerflich sein sie nicht zu nutzen, weil es gar nicht möglich ist in Python.Marky hat geschrieben:Das sagt niemand, nur finde ich syntaktische Unterstützung nicht verwerflich und sie zu nutzen auch nicht.
Du meinst den Bodenstrich? Ja, ist eine kleine Hürde, aber wenn man Python programmiert, dann weiß man dass man ``_``-Attribute nur anfasst, wenn man weiß was man will. Es ist nun mal vieles simpler gemacht und so gesehen ist es auch nicht schwer in Java in der IDE einen Menüpunkt anzuklicken "hol mir das Attribut via Reflection".Marky hat geschrieben:Wenn alles nur aus Konventionen besteht, dann ist es leichter diese zu verletzen, als wenn man die syntaktisch Hürde überwinden muss. Ich meine, eine gewisse Hürde gibts ja in Python auch, nur verstehe ich eben solche Aussagen nicht, dass man das nicht oder kaum braucht usw ...
In Java ist das nicht so üblich, aber angenommen das wäre so, dann würden sich die meisten Leute dabei doch auch nichts denken "ist halt so", ggf sogar "OOP ist eben so". Es hängt wohl ab, was man selbst gewöhnt ist und erwartet.Marky hat geschrieben:Es ist sicherlich viel Ansichtssache bei dem Thema, aber in Java kann ich auch alles public machen ... Es ist nur eben die Frage, ob das OO-technisch dann noch Sinn macht.
Letztendlich ist der Mechanismus dass alles public ist in meinen Augen genauso gangbar. Bei realen Objekten ist es auch so dass man auf interna zugreifen muss, also ggf. das Auto zerlegt und womöglich kaputtmacht. Man muss eben selbst wissen, in wie weit man gehen will. So gesehen ist ``private`` genauso eine Konvention wie ``_``, in Java ist sie syntaktisch, in Python eher semantisch.> Python *is* object-oriented, but it is not (as your definition suggests)
> object-fascist.
I'd put it more mildly. Python is object oriented. The orientation is
there but the fanatism is gone.
Wenn er sich nicht dran hält, dann ist das sein Problem. Der Bodenstrich hat sich in der Community durchgesetzt, und wenn sich jemand nicht daran halten will ist das seine Entscheidung. Da muss man ihm nicht zusätzlich Steine in den Weg werfen.Marky hat geschrieben:Es kann ja jeder so coden wie er möchte, nur finde ich, dass es mind. genausoviel Sinn macht, die Möglichkeit zu nutzen, per Codierung (Syntax) klar zu machen, dass keiner in die Internas greifen soll, als es durch Konvention festzulegen. Hoffentlich hält sich dann jeder dran.
``Tür._aufbrechen`` ist von der Sicherheit genauso wie ``private void aufbrechen``. Der Unterschied ist eigentlich nur die Einstellung des Programmierers. In Java versucht man die Programmierer vor sich selbst zu schützen, in Python geht man vom mündigen Programmierer aus.Marky hat geschrieben:Wenn ich ein Tür abschließe, dann kann ich die auch mit Gewalt öffnen, nur wenn sie abgeschlossen ist, kann eben nicht jeder Heini rein, der gerade mal zufällig davorsteht, und noch nicht mal weiß, was er da überhaupt soll.
Ganz recht. Dafür gibt es ja sowohl in Python wie auch in anderen Sprachen Dokumentation, die über ein einfaches ``private``/``publich`` Schwarzweißsehen hinausgeht und erklärt wie man die API richtig nutzt (und Kommentare sowie ggf. noch andere Dokumente erklären die Implementierung).Marky hat geschrieben:Man kann doch nicht immer davon ausgehen, dass der Entwickler der Software zeit seines Lebens der einzige ist, der an dem Programm arbeitet und damit genau weiß, was er tunlichst unterlassen sollte.
Schoen gesagtLeonidas hat geschrieben:In Java versucht man die Programmierer vor sich selbst zu schützen, in Python geht man vom mündigen Programmierer aus.
na ja, die __ Konvention geht ja schon ein wenig über die reine Syntax-Konvention hinaus. Auch wenn das auf Name-mangeling hinausläuft oder wie sich das nennt.Leonidas hat geschrieben: Ja, stimmt. Gibt es aber nicht, also kann es wohl nicht verwerflich sein sie nicht zu nutzen, weil es gar nicht möglich ist in Python.
Finde ich auchnkoehring hat geschrieben:Schoen gesagtLeonidas hat geschrieben:In Java versucht man die Programmierer vor sich selbst zu schützen, in Python geht man vom mündigen Programmierer aus.![]()
Kein Problem. Es geht mir übrigens nicht darum, Java gegenüber Python in den Himmel zu heben, sondern einfach die (andere) Sichtweise zu verstehen, wenn man mit Python arbeitet.Leonidas hat geschrieben:'Tschuldige für die vielen mäßig passenden Vergleiche (das ist immer so das Problem). Vielleicht wirst du dann meinen Standpunkt verstehen - wenn nicht, dann ignorier sie einfach.
Achtung, wenn du Name Mangling als "private"-Mechanismus verwendest, wirst du auf Kritik stoßen. Dafür ist es nämlich weniger gedacht. Meist nimmt man für private ``_`` und lässt Mangling Mangling sein.Marky hat geschrieben:na ja, die __ Konvention geht ja schon ein wenig über die reine Syntax-Konvention hinaus. Auch wenn das auf Name-mangeling hinausläuft oder wie sich das nennt.
Ein Zugriff von außen mit der Attribut-Bezeichnung von innen ist auf das Objekt-Attribut nicht mehr direkt möglich. Das reicht mir doch schon![]()
Edit: Schöner Blogpost zu ``__``.Python-Docs hat geschrieben:Note that the mangling rules are designed mostly to avoid accidents; it still is possible for a determined soul to access or modify a variable that is considered private.
Sinnhaftigkeit unterscheidet sich meist sehr oft von MachbarkeitNaja, dafür ist es ja auch nicht gedacht. Wer z.B. ein Feld "password" private macht nur weil keiner ran soll hat was falsch verstanden.
Klar ist. dass ich (zumindest in einer Umgebung, die Zeigerarithmetik unterstützt) immer an private Attribute komme, wenn ich es wirklich will. Aber greife ich z.B. in C++ auf eine private Eigenschaft zu, erhalte ich eine Fehlermeldung des Compilers. Durch casten oder Zeigerspielereien komme ich wie gesagt natürlich an die Daten ran, aber da ist ein zunächst einmal gewissser Aufwand dabei. Die Konvention, _ als Präfix für privat gemeinte Attribute zu verwenden, wird dagegen nur durch die Disziplin des Verwenders der Klasse durchgesetzt - ein absichtliches Zugreifen auf ein solches Element ist also als solches erst nach näherer Analyse des Codes und gggf. Konsultation der Dokumentation zu ersehen.private schützt vor Murphy, nicht vor Macchiavelli.
Der höhere Aufwand ist, "_" im Attributsnamen zu sehen und daraufhin die Dokumentation zu konsultieren. Wer das nicht tut, ist selbst schuld wenns richtig kracht.Meiner Ansicht nach sollte eine gute Programmiersprache den Programmierer insofern bevormunden, dass konzeptuell "schlechte" Verhaltensweisen zwar möglich, aber mit höherem Aufwand verbunden sind.
Die Sache mit _ ist eben keine Eigenschaft der Sprache, sondern eine Konvention, die der Programmierer der Klasse einhält - oder auch nicht. Es ist ein unverbindlicher Vorschlag, mehr nicht. Ich kann mich nicht darauf verlassen, und auch eine (vernünftige) Dokumentation kann ich nicht unbedingt erwarten. Also bleibt mir, den Quellcode der Fremdklasse anzusehen - super, ich hab ja sonst nichts besseres zu tun.str1442 hat geschrieben: Der höhere Aufwand ist, "_" im Attributsnamen zu sehen und daraufhin die Dokumentation zu konsultieren. Wer das nicht tut, ist selbst schuld wenns richtig kracht.
Also ich denke man sollte gerade eine gute Dokumentation erwarten können! Was nützt Dir ein Modul ohne Doku? Nichts! Aber das ist doch in jeder Sprache soPythonÜbernehmenSie hat geschrieben: Ich kann mich nicht darauf verlassen, und auch eine (vernünftige) Dokumentation kann ich nicht unbedingt erwarten. Also bleibt mir, den Quellcode der Fremdklasse anzusehen - super, ich hab ja sonst nichts besseres zu tun.
Also ich habe das noch nie benutzt - mag aber sein, dass ich nicht grad nen Python-Gott bin und meine Erfahrung da nicht zähltWenn dieser Mechanismus also in vielen Fällen angebracht ist, warum ihn dann so verwirklichen, dass er ohne den geringsten Aufwand ausgehebelt werden kann? Von diesem Gesichtspunkt aus betrachtet stellt das Fehlen eines solchen Mechanismus eine Designschwäche der Sprache dar, die auf der semantischen Metaebene der Benennung ausgeglichen werden soll.