Accessors in Python jemals gerechtfertigt?

Merke ich, dass in den meisten Fällen, ist es bevorzugt in Python einfach direkt auf die Attribute zuzugreifen, da es kein wirkliches Konzept der Kapselung, wie es ist in Java und dergleichen. Allerdings Frage ich mich, ob es gibt keine Ausnahmen, insbesondere bei abstrakten Klassen mit unterschiedlichen Implementierungen.

Sagen wir mal ich Schreibe ein Haufen von abstrakten Klassen (da bin ich), und dass Sie repräsentieren, was mit zu tun, mit version control Systemen wie repositories und Revisionen (weil Sie es tun). So etwas wie eine SvnRevision und ein HgRevision und ein GitRevision sind sehr eng miteinander semantisch verknüpft sind, und ich will, dass Sie in der Lage, die gleichen Dinge tun (so kann ich code an anderen stellen, dass wirkt auf jede Art von Repository-Objekt, und Agnostiker von der Unterklasse), das ist der Grund, warum ich möchte, dass Sie Erben von einer abstrakten Klasse. Jedoch, Ihre Implementierungen unterscheiden sich erheblich.

So weit, die Unterklassen, die implementiert wurden, teilen eine Menge von Attribut-Namen, und in einer Menge von code außerhalb von Klassen selbst, die direkte Attribut-Zugriff verwendet. Zum Beispiel, jeder Unterklasse von Revision ist ein Autor-Attribut und ein Attribut "Datum", und so weiter. Aber die Attribute sind nicht beschrieben, die überall in der abstrakten Klasse. Dies scheint mir wie eine sehr fragile Konstruktion.

Wenn jemand will, zu schreiben, eine andere Umsetzung der Revision Klasse, ich fühle mich wie Sie sollten in der Lage sein zu tun, also nur durch das betrachten der abstrakten Klasse. Jedoch, eine Implementierung der Klasse, erfüllt alle abstrakten Methoden werden mit ziemlicher Sicherheit scheitern, weil die Verfasser nicht wissen, dass Sie brauchen Attributen mit dem Namen 'Autor' und 'Datum' und so weiter, also code, der versucht, Zugriff Revision.Autor, wird eine Ausnahme ausgelöst. Wohl nicht schwer zu finden, die Quelle des Problems, aber reizt trotzdem, und es fühlt sich einfach wie ein unelegant design.

War meine Lösung zu schreiben accessor-Methoden für die abstrakten Klassen (get_id, get_author, etc.). Ich dachte, das war eigentlich eine ziemlich saubere Lösung, da es beseitigt die willkürliche Beschränkungen auf, wie die Attribute benannt und gespeichert, und nur deutlich macht, welche Daten das Objekt muss in der Lage sein, um Zugriff. Jede Klasse implementiert alle Methoden der abstrakten Klasse Arbeit... das fühlt sich richtig an.

Sowieso, das team, mit dem ich arbeite hasst diese Lösung (scheinbar aus dem Grund, dass Accessoren sind unpythonic, das kann ich nicht wirklich streiten). Also... was ist die alternative? Dokumentation? Oder ist das problem, das ich mir vorstelle, ein nicht-Problem?

Hinweis: ich habe als Eigenschaften, aber ich glaube nicht, Sie sind eine saubere Lösung.

  • "es gibt kein wirkliches Konzept der Kapselung"? Was? Ich benutze Kapselung die ganze Zeit in meinen Entwürfen.
  • Kapselung ist vielleicht ein überladener Begriff. Ich war mit dabei, als es bezieht sich auf Informationen, die sich verstecken. Die ersten paar google-Treffer für "python Kapselung" wurden entlang der Linien von "python nicht haben Kapselung", so fühlte ich mich in Ordnung, es zu sagen.
  • Wenn du redest private Variablen, Python hat diese. Sie sind nicht so stark genutzt wird, aber da Sie nicht viel gutes tun. Ich bin mir nicht sicher, welche Art von "verstecken" Sie reden, so sollten Sie wahrscheinlich die links, Zitate und einige definition Ihrer Begriffe.
  • Nein, tut es nicht. Es Konventionen, um anzugeben, dass ein Attribut soll privat sein, aber Sie sind nicht sinnvoll durchgesetzt werden. Verlassen Sie sich auf die mit freundlicher Genehmigung. Siehe den ersten Abschnitt dieses Artikels für das, was gemeint ist, durch information hiding: en.wikipedia.org/wiki/...
  • Bitte definieren Sie "sinnvoll durchgesetzt". Ich bin mir nicht sicher, was Sie zu tun versuchen, aber es ist sicherlich nicht klar. Die privaten Variablen sind (natürlich) für denjenigen sichtbar, liest die Quelle, aber nicht sichtbar für jemanden, der nicht ein help(). Was ist "sinnvoll" für dich?
  • Sprache-Mechanismus für die Beschränkung des Zugangs zu einigen der Objekt-Komponenten." Python hat diese. "Eine Sprache zu konstruieren, die es erleichtert, die Bündelung der Daten mit den Methoden, die auf die Daten". Python hat diese. Ich verstehe nicht, welchen Unterschied Sie machen. Oder -- vielleicht -- durch "Einschränkung" bedeutet "Prävention"?
  • Ein Programmierer, der importiert die Klasse aus einem anderen Modul können überprüfen und ändern Sie den Wert von "privaten" Variablen in Python. Dies ist sicherlich nicht der Fall in Sprachen wie Java oder C++.
  • Ist es das, was du redest? Beschränkung der Attribut-Einstellung? Bitte versuchen Sie, spezifisch über diese 'Kapselung', was du bist suchen für.
  • Tut mir Leid, dass Sie falsch verstanden, aber diese Begriffe sind weit verbreitet, und ich wollte nicht denken, ich würde Ihnen zu erklären. Es scheint, dass Sie immer noch nicht ganz, haben Sie Ihre finger auf Sie, aber es ist am Rande mit dieser Frage und versuchen, den hammer es durch Kommentare, die gebunden ist, um ein schmerzhafter Prozess sein. Nur schauen Sie in einem Buch oder auf Wikipedia, oder auf StackOverflow. Es gibt viele gute Erklärungen gibt.
  • Begriffe sind weit verbreitet", Und Sie Fragen, für einige Besondere features, die ich nicht verstehen kann. Ich verstehe die Bedingungen im Allgemeinen. Ich kann nicht herausfinden, was du bedeutet Sie verwenden der Begriffe. Ich kann nicht herausfinden, was du wollen.

InformationsquelleAutor Coquelicot | 2010-07-20
Schreibe einen Kommentar