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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aber Sie sind es. Mit Eigenschaften ist, müssen Sie die Klasse Signatur, die Sie möchten, während in der Lage, verwenden Sie die Eigenschaft, als ein Attribut selbst.
Ist wahrscheinlich ähnlich zu dem, was Sie jetzt haben. Zu besänftigen Ihrem team, würden Sie müssen nur fügen Sie den folgenden:
Könnten Sie auch
property
als Dekorateur:Zu machen, readonly einfach weglassen
set_id
/dieid.setter
bit.Du hast den Punkt verpasst. Es ist nicht die fehlende Kapselung, entfällt die Notwendigkeit, Zugriffs -, ist es die Tatsache, dass durch den Wechsel von direkter Attribut um eine Eigenschaft, die Sie hinzufügen können, einen accessor zu einem späteren Zeitpunkt ohne änderung der veröffentlichten Schnittstelle in keiner Weise.
In vielen anderen Sprachen, wenn Sie setzen ein Attribut als public und dann später wollen, wickeln Sie einige code, um ihn auf den Zugang oder die mutation dann müssen Sie änderungen an der Schnittstelle und jemand mit dem code hat zumindest neu kompilieren und eventuell zu Bearbeiten, Ihren code auch. Python ist nicht so: Sie können flip-flop zwischen Attribut bzw. die Eigenschaft nur so viel wie Sie wollen und kein code, der mit der Klasse zu brechen.
Nur hinter einer Eigenschaft.
Weiß nicht, was das sollte wahr sein. Einen "programmer' s guide", ein "erweitern" - Dokument, plus etwas training geeignet scheint mir.
In diesem Fall, die Dokumentation ist nicht abgeschlossen. Vielleicht ist die abstrakte Klasse braucht eine bessere docstring. Oder "programmer' s guide", oder ein "erweitern" - Dokument.
Auch, es scheint nicht sehr schwer zu (1) das Dokument auf diese Attribute in der docstring und (2) stellen Standardwerte in der
__init__
Methode.Was ist falsch mit der Bereitstellung von zusätzlichen support für Programmierer?
Es klingt wie Sie haben ein Soziales problem, kein technisches. Schreiben von code zur Lösung eines sozialen Problems scheint wie eine Verschwendung von Zeit und Geld.
Die Diskussion bereits beendet, vor einem Jahr, aber dieses snippet schien verräterisch, es ist diskussionswürdig:
Uh, sowas ist zutiefst falsch. (Was S. Lott sagte, minus die persönlichen Kommentare).
Wenn diese erforderlich sind, die Mitglieder, sind Sie nicht referenziert werden (wenn nicht benötigt) in den Konstruktor, und definierten docstring? oder zumindest, wie erforderlich, die Argumente von Methoden, und wieder dokumentiert?
Wie könnte ein Benutzer der Klasse nicht wissen, was die gewünschten Mitglieder sind?
Zu im Auftrag des Teufels, was ist, wenn der Konstruktor(en) erfordert, dass Sie liefern alle die Mitglieder, der/die erforderlich sein können, was Problem hat, die Ursache?
Auch, sind Sie die überprüfung der Parameter beim übergeben, und werfen informativ Ausnahmen?
(Das ideologische argument der accessor-vs-Eigenschaft ist eine sidebar. Eigenschaften vorzuziehen sind, aber ich glaube nicht, dass das das Problem mit Ihrem Klasse design.)