Python 2.7: Wie erstellen Sie getter/setter-Funktionen zum Zugriff auf Attribute der Klasse ohne Vererbung?

dies ist wahrscheinlich ein super nub Frage, Entschuldigung. Ich versuche, die die Wirkung erzielen, die in Python bin ich vertraut mit PHP, das getter-und setter-Funktionen für private Attribute.

In PHP werde ich Häufig etwas wie das hier tun:

<?php
class newClass() {
    private $var = null;

    function newClass($initVal) {
        //init
    }

    public function get($var) {
        if ( isset($this->$var) ) {
            return $this->$var;
        }
    }
}
?>

Aber, der Versuch, die Idee in Python:

class newClass():
    def __init__(self, initVal):
        self.__nameOfVar1 = initVal
        self.__nameOfVar2 = initVal


    def get(self, var):
                #assuming, when called, var = nameOfVar1
        if self.__var:
            return self.__var

Wirft einen Fehler AttributeError:'newClass' object has no attribute '__var'

- Und das zu Recht, gibt es nicht. Wie Baue ich getter-und setter-Funktionen zum Zugriff auf private Attribute?


UPDATE:

Ich habe die ursprüngliche Frage, weil es scheint, nützlich für Neulinge, um Python zu lernen, welche Konventionen aus anderen Sprachen, die Sie versehentlich nach vorne bringen. Aber in Wirklichkeit, meine anfängliche problem war ein bisschen anders, in versuchen, das problem mehr allgemein ich verschleierte meine tatsächlichen Bedarf. Hier ist also eine änderung:

In der Tat war ich nicht die Arbeit mit den privaten Attributen; in der Tat, bin ich den Umgang mit dem Versuch, den pass ein Attribut nach unten durch eine Komposition Umstand. ie:

Class A als Attribut hat eine Class B Objekt, dass nicht die Erben von Class A . Es ist fast nie der Fall, dass Class B muss alle Informationen aus Class A, aber in meinem Projekt gibt es einen Umstand, wo, wenn ein Benutzer keine Informationen zu Class B gibt es eine Anweisung, dass macht einen letzten verzweifelten Versuch zu folgern, eine vernünftige Lösung, aber es erfordert, Informationen aus Class A dass Sie normalerweise nie braucht.

Ich bauen könnte Class B immer gehabt haben, die Informationen, aber das bedeutet, dass fast immer ich bin nur verschwenden Zeit und Speicher (trivial aber könnte es sein). Um diese konkrete stellen Sie sich dies:

toothbrush hat bristles, und bristles können, sofern der Benutzer eine bevorzugte Bürsten Erfahrung, erstellen Sie eine Reihe von Borsten angebracht, entweder eine "weiche" oder eine "Firma" Pinsel. Aber, wenn der Benutzer nicht dieser, dann möchte ich bristles Fragen brush für seine Oberfläche, sodass es zu erraten, was einer durchschnittlichen Anzahl sein sollte.

Ich kam mit dieser, aber ich habe das intuitive Gefühl, dass Python-Programmierer hassen mich dafür; ich möchte nur verstehen, warum:

@staticmethod
def request(self, var):
    appIndex = self.__dict__
    if appIndex[var]:
        return appIndex[var]

print Class.request(instance, var)

Funktioniert wie ein Charme, aber ich denke, das ist Python Ketzerei. Warum?

  • Bevor Sie dies tun, Fragen Sie sich selbst zwei Fragen: 1) Warum sind Sie mit private Attribute? 2) Warum sind Sie getter/setter-Funktionen? Beide sind nicht sehr Pythonic und es gibt in der Regel bessere Möglichkeiten zur Erledigung Ihrer Aufgabe in Python. Eine Dritte Frage ist, dass, anstatt zu überprüfen, ob eine variable gesetzt ist, sollten Sie immer legen Sie es zunächst, um einige default-Wert, und dann prüfen, dass anstelle der überprüfung, ob es "eingestellt".
  • Nein ist es nicht; dieser code wirft einen SyntaxError statt, weil es keine def für __init__. Selbst wenn, dass war es, den __var würde nicht werfen ein Attribut Fehler, weil es entstellt im Ort, wie der Verweis in __init__.
  • halten Sie im Verstand, die in python es gibt kein solches Ding wie eine wahrhaft private Variablen ...
  • Ja, du hast Recht, aber das war wirklich nicht das problem, ich bin wirklich offensichtlich über eine Allgemeine form des Problems zu Folgen stackoverflow-übereinkommen über die nützlich sein für alle. Also, danke für den Hinweis auf den wirklich, wirklich, wirklich offensichtlich und trivial, dass wäre nicht möglich, werfen Sie die Fehler, die ich eigentlich schon erwähnt, in der Frage, aber, obwohl ich bin neu in python, ich weiß, wie man eine Funktion definieren. Aber, hey, Sie haben definitiv mir, nice job code Polizei.
  • Es ist viel mehr Ihre Forderung, dass der code werfen würde AttributeError dass ich Probleme mit, weil es für Sie nicht. Ich versuchte Ihren code, um zu überprüfen, dass ich nicht Lesen es falsch. Sie werden Fragen, Fragen zu einem bestimmten Stück code, so sollten Sie vielleicht den code zu testen, die besagt, was dieser code tut?
  • Wenn es nicht, das war für triviale Gründe, aber ich habe es geändert, um deutlicher zu sein. Ich persönlich denke immer noch, die Frage, die ich stellte, war general, und offensichtlich, und die anderen Antworten auf dieser Seite bestätigen Sie es. Wenn Sie diesen code ausführen, um auch die Frage verstehen, dann ist dies wahrscheinlich nicht eine Frage sollten Sie beantworten. Nicht dass ich nicht dankbar, Sie helfen wollte, bin ich, aber sonst niemand hatte irgendwelche Probleme greifen mein Punkt. Hätte ich kopierte und klebte meinen eigenen code, sondern entschied sich zu schreiben, es in allgemeiner Weise für alle anderen. Sorry, es war nicht makellos, aber es hat die Kommunikation den Punkt.
  • Möglich, Duplikat der What die pythonic Weg, um Getter und setter?

InformationsquelleAutor Jonline | 2013-04-24
Schreibe einen Kommentar