Frage

Einer der wirklich schönen Dinge über Python ist die Einfachheit, mit der Sie Variablen benennen können, die den gleichen Namen wie die Accessor haben:

self.__value = 1

def value():
    return self.__value

Gibt es eine einfache Möglichkeit, den Zugriff auf die privaten Mitglieder einer Klasse bereitzustellen, die ich Unterklasse wünschen? Oft wünsche ich in einer Klasse mit den Rohdaten Objekte einfach zu arbeiten, ohne Zugriffs- und Mutatoren die ganze Zeit zu verwenden.

Ich weiß, das gegen die allgemeine Vorstellung von privat zu gehen scheint und die Öffentlichkeit, aber in der Regel die Klasse I zu Unterklasse versuchen ist ein meine eigenen, die ich sehr zufrieden bin, die Mitglieder aus zu einer Unterklasse, aber nicht auf eine Instanz zu belichten dieser Klasse. Gibt es eine saubere Art und Weise, diese Unterscheidung zu schaffen?

War es hilfreich?

Lösung

Nicht bequem, ohne weiteren Bruch Verkapselung. Das Doppelstrich-Attribut wird indem Sie ein ‚_className‘ für die Klassennamen-zerfleischt es in zugegriffen wird. Also, wenn Sie eine ‚ContainerThing‘ Klasse, die ein ‚__value‘ Attribut hat, wird das Attribut tatsächlich als ‚_ContainerThing__value gespeichert werden ‘. Ändern Sie den Klassennamen (oder Refactoring, wo das Attribut zugeordnet ist) bedeuten würde, alle Subklassen zu brechen, die versuchen, dieses Attribut zugreifen zu können.

Das ist genau, warum der Doppelstrich Name-Mangeln (was nicht wirklich „privat“ ist, nur „unbequeme“) ist eine schlechte Idee zu verwenden. Verwenden Sie einfach einen Single Unterstrich. Jeder weiß, nicht Ihr ‚privates‘ Attribut zu berühren, und Sie werden noch in der Lage sein, darauf zuzugreifen in Unterklassen und anderen Situationen, in denen es ist verdammt praktisch. Das Name-Mangeln von Doppelstrich Attributen ist nur sinnvoll, Name-Kollisionen für Attribute zu vermeiden, die wirklich spezifisch für eine bestimmte Klasse sind, die extrem selten ist. Es bietet keine zusätzliche ‚Sicherheit‘, da auch die Namen-verstümmelten Attribute sind trivialerweise zugänglich.

Für die Aufzeichnung ‚__value‘ und ‚value‘ (und ‚_value‘) sind nicht die gleichen Namen. Die Unterstreichungen sind Teil des Namens.

Andere Tipps

„Ich weiß, dass dies gegen die allgemeine Vorstellung von privaten und öffentlichen zu gehen scheint“ Nicht wirklich „gegen“, nur anders aus C ++ und Java.

Privat - wie in C ++ implementiert und Java ist nicht ein sehr nützliches Konzept. Es hilft manchmal, Details der Implementierung zu isolieren. Aber es ist Art und Weise überstrapaziert.

Python-Namen mit zwei __ beginnen, sind besondere und Sie sollten nicht als normale Sache sein, Attribute mit Namen wie diese zu definieren. Namen mit __ sind speziell und im Rahmen der Umsetzung. Und ausgesetzt für Ihren Gebrauch.

Namen mit einem _ beginnen, sind „privat“. Manchmal sind sie verborgen, ein wenig. Die meiste Zeit gilt die „mündig Erwachsene“ Regel - sie nicht dummerweise verwendet, sind sie jederzeit ohne vorherige Ankündigung geändert werden.

Wir setzen „privat“ in Anführungszeichen, weil es nur eine Vereinbarung zwischen Ihnen und Ihren Benutzern. Sie haben Dinge mit _ markiert. Ihre Benutzer (und sich selbst) sollte das ehren.

Oft haben wir Methode Funktionsnamen mit einem führenden _ um anzuzeigen, dass wir betrachten sie ohne vorherige Ankündigung zu sein „privater“ und Änderungen vorbehalten.

Die endlosen Getter und Setter, die Java erfordert nicht so oft in Python verwendet. Python Selbstbeobachtung flexibler ist, haben Sie Zugriff auf ein internes Wörterbuch des Objekts von Attributwerten, und Sie haben erste Klasse Funktionen wie getattr() und setattr().

Des Weiteren haben Sie die property() Funktion, die oft verwendet wird, Getter und Setter auf einen einzigen Namen zu binden, wie ein einfaches Attribut verhält, ist aber eigentlich gut definierte Methode Funktionsaufrufe.

Nicht sicher, wo es zu zitieren aus, aber die folgende Erklärung in Bezug Schutz für den Zugriff ist Pythonic Kanon:. „Wir sind alle mündig Erwachsene hier“

So wie Thomas Wouters festgestellt hat, ist ein einzelner Unterstrich die idiomatische Weise ein Attribut der Markierung als Teil des internen Zustand des Objekts ist. Zwei Unterstrichen nur liefert Namen Mangeln einfachen Zugriff auf das Attribut zu verhindern.

Danach sollten Sie nur erwarten, dass der Kunde von Ihrer Bibliothek gehen und sich nicht durch Einmischung mit dem „privaten“ in den Fuß schießen Attribute.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top