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 keinedef
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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was du suchst ist
Eigenschaften
:Ausgabe:
@property
. Wenn die Lektion, die Sie aus diesem "ich sollte erstellen von get-und Set-Methoden für jedes Attribut mit@property
", dann machst du die Dinge so falsch wie möglich.list
nur, dass es sein kann gelesen werden, richtig? Ja, so ist alles sollte funktionieren.import this
) und die letzten/cool stuff (z.B. David Beazley ' s Präsentationen auf generator-pipelines, Greg Ewing-Ertrag aus dem tutorial, ...). Und ich kann auch nicht denken, wo kann man sinnvoll Fragen, die Frage (ALSO an, es werden mit ziemlicher Sicherheit geschlossen werden, und vielleicht downvoted, als nicht angemessen, um die Q&A-format). Tut mir Leid, dass.Nun, das erste Python nicht haben private Variablen. Was du meinst ist das name–mangling. Der Zweck ist, zu verhindern, dass Kollisionen mit Namen, die beim importieren von Modulen. Wann immer Sie schreiben Sie ein variablein eine Klasse mit zwei ununderscores vor, den Namen der Klasse Hinzugefügt wird, die vor ihm stehen. Es wäre also ratsam, benennen Sie die variable "
__var__
" was ist das custom für python "private" Dinge.Auf der anderen Seite jedoch, in python, wenn Sie wollen, einige werden in der Lage zu setzen und erhalten eine variable, es macht generell am meisten Sinn, einfach ermöglichen den direkten Zugriff (anders als in Java oder anderen Sprachen).
__magic__
" Namen sind reserviert für die Umsetzung (Python-Implementierung, die ist). Die pythonic Namenskonvention für die "privaten" (wie in "keine Sorge, die Garantie erlischt, wenn entsiegelt") Attribute '_single_leading_underscore'