Ich habe Python gelernt, indem ich einige Pygame-Tutorials befolgt habe .
Darin fand ich eine umfassende Verwendung des Schlüsselworts self , und da ich hauptsächlich aus Java stamme, vergesse ich immer wieder, self einzugeben . Zum Beispiel self.rect.centerx
würde ich anstelle von tippen rect.centerx
, weil rect für mich bereits eine Mitgliedsvariable der Klasse ist.
Die Java parallel kann ich denke , für diese Situation mit allen Verweisen auf Membervariablen Präfix wird mit dieser .
Habe ich es nicht geschafft, alle Mitgliedsvariablen mit dem Präfix self zu versehen , oder gibt es eine Möglichkeit, sie zu deklarieren, die es mir ermöglicht, dies zu vermeiden?
Auch wenn das, was ich vorschlage, nicht pythonisch ist , würde ich gerne wissen, ob es möglich ist.
Ich habe mir diese verwandten SO-Fragen angesehen, aber sie beantworten nicht ganz, wonach ich suche:
m_
Präfixes für alle Mitgliedsnamen, die von einigen C ++ / Java-Programmierern beobachtet werden? Die Verwendung vonself.
hilft auf ähnliche Weise bei der Lesbarkeit. Außerdem sollten Sie dirtsimple.org/2004/12/python-is-not-java.html lesen .m_
nur für nicht öffentliche nicht statische Datenelemente verwendet (zumindest in C ++).mVariableName
, für Mitgliedsvariablen beim Codieren in Java zu verwenden. Ich denke, @ Anurags Kommentar fasst es ziemlich gut zusammen, was ein Java-Entwickler tun sollte, wenn er Python lernt.Antworten:
Python erfordert die Angabe von self. Das Ergebnis ist, dass es keine Verwirrung darüber gibt, was ein Mitglied ist und was nicht, auch ohne dass die vollständige Klassendefinition sichtbar ist. Dies führt zu nützlichen Eigenschaften wie: Sie können keine Mitglieder hinzufügen, die versehentlich Nichtmitglieder beschatten und dadurch den Code beschädigen.
Ein extremes Beispiel: Sie können eine Klasse schreiben, ohne zu wissen, welche Basisklassen sie haben könnte, und immer wissen, ob Sie auf ein Mitglied zugreifen oder nicht:
Das ist das Ganze Code! (some_function gibt den als Basis verwendeten Typ zurück.)
Eine andere, bei der die Methoden einer Klasse dynamisch zusammengesetzt sind:
Denken Sie daran, dass diese beiden Beispiele extrem sind und Sie sie nicht jeden Tag sehen werden. Ich schlage auch nicht vor, dass Sie häufig Code wie diesen schreiben sollten, aber sie zeigen deutlich, dass Aspekte des Selbst explizit erforderlich sind.
quelle
self
.__shadow__ myFieldName
. Das würde auch ein versehentliches Abschatten verhindern, nicht wahr?Frühere Antworten sind im Grunde alle Varianten von "Sie können nicht" oder "Sie sollten nicht". Obwohl ich dem letzteren Gefühl zustimme, ist die Frage technisch immer noch unbeantwortet.
Darüber hinaus gibt es legitime Gründe, warum jemand etwas tun möchte, das der eigentlichen Frage entspricht. Eine Sache, auf die ich manchmal stoße, sind lange mathematische Gleichungen, bei denen die Verwendung langer Namen die Gleichung nicht wiedererkennbar macht. Hier sind einige Möglichkeiten, wie Sie dies in einem Beispiel aus der Dose tun können:
Das dritte Beispiel - dh Verwenden
for k in self.__dict__ : exec(k+'= self.'+k)
ist im Grunde das, wonach die Frage tatsächlich fragt, aber lassen Sie mich klarstellen, dass ich es im Allgemeinen nicht für eine gute Idee halte.Weitere Informationen und Möglichkeiten zum Durchlaufen von Klassenvariablen oder sogar Funktionen finden Sie in den Antworten und in der Diskussion zu dieser Frage . In diesem Blog-Beitrag erfahren Sie, wie Sie Variablen dynamisch benennen können und warum dies normalerweise keine gute Idee ist .
UPDATE: Es scheint keine Möglichkeit zu geben, lokale Elemente in einer Funktion in Python3 dynamisch zu aktualisieren oder zu ändern, sodass calc3 und ähnliche Varianten nicht mehr möglich sind. Die einzige Python3-kompatible Lösung, an die ich jetzt denken kann, ist die Verwendung von
globals
:Was wiederum im Allgemeinen eine schreckliche Praxis wäre.
quelle
locals
statt verwendenexec
?locals().update(self.__dict__)
in Python 2 und 3 versucht , aber es hat nicht funktioniert. In Python3 ist sogar der 'exec'-Trick keine Option mehr. Auf der anderen Seiteglobals().update(self.__dict__)
funktioniert, wäre aber im Allgemeinen eine schreckliche Praxis.Eigentlich
self
ist es kein Schlüsselwort, sondern nur der Name, der üblicherweise dem ersten Parameter von Instanzmethoden in Python gegeben wird. Und dieser erste Parameter kann nicht übersprungen werden, da dies der einzige Mechanismus ist, mit dem eine Methode weiß, auf welche Instanz Ihrer Klasse sie aufgerufen wird.quelle
Sie können beispielsweise einen beliebigen Namen verwenden
oder auch
Sie müssen jedoch keinen Namen für den Bereich verwenden.
Ich empfehle Ihnen nicht, etwas anderes als sich selbst zu verwenden, es sei denn, Sie haben einen überzeugenden Grund, da dies für erfahrene Pythonisten fremd wäre.
quelle
self
, und Sie sollten der Konvention folgen. Dadurch wird Ihr Code für jeden erfahrenen Python-Programmierer, der ihn betrachtet, leichter verständlich. (Dies schließt ein, dass Sie in sechs Monaten versuchen herauszufinden, was Ihr altes Programm tut!)def function(_, variable): _.variable = variable
def funcion(*args): args[0].variable = args[1]
Ja, Sie müssen immer angeben
self
, da explizit nach der Python-Philosophie besser als implizit ist.Sie werden auch feststellen, dass sich die Art und Weise, wie Sie in Python programmieren, stark von der Art und Weise unterscheidet, wie Sie in Java programmieren. Daher nimmt die Verwendung von
self
tendenziell ab, da Sie nicht alles innerhalb des Objekts projizieren. Vielmehr nutzen Sie Funktionen auf Modulebene, die besser getestet werden können.Apropos. Ich hasste es zuerst, jetzt hasse ich das Gegenteil. Gleiches gilt für die eingedrückte Durchflussregelung.
quelle
self
in keiner Weise berühren . Was bringt es also, sie in der Klasse zu haben?Das "Selbst" ist der herkömmliche Platzhalter der aktuellen Objektinstanz einer Klasse. Es wird verwendet, wenn Sie auf die Eigenschaft, das Feld oder die Methode des Objekts innerhalb einer Klasse verweisen möchten, als würden Sie auf "sich selbst" verweisen. Aber um es kürzer zu machen, hat jemand im Python-Programmierbereich angefangen, "self" zu verwenden, andere Bereiche verwenden "this", aber sie machen es als Schlüsselwort, das nicht ersetzt werden kann. Ich habe eher "its" verwendet, um die Lesbarkeit des Codes zu verbessern. Es ist eines der guten Dinge in Python - Sie haben die Freiheit, Ihren eigenen Platzhalter für die Instanz des Objekts zu wählen, außer "Selbst". Beispiel für sich selbst:
Jetzt ersetzen wir 'Selbst' durch 'Sein':
was ist jetzt besser lesbar?
quelle
s
(oder ein anderer einzelner Buchstabe) stattits
s
hat die gleiche Bedeutung: ein Alias für die Klasseninstanz. Ich müsste nachschlagen, wasits
im Kontextself ist Teil der Python-Syntax für den Zugriff auf Mitglieder von Objekten. Ich fürchte, Sie bleiben dabei
quelle
Tatsächlich können Sie das Rezept "Implizites Selbst" aus der Präsentation von Armin Ronacher "5 Jahre schlechte Ideen" (google it) verwenden.
Es ist ein sehr cleveres Rezept, wie fast alles von Armin Ronacher, aber ich finde diese Idee nicht sehr ansprechend. Ich denke, ich würde es vorziehen, dies explizit zu tun in C # / Java.
Aktualisieren. Link zum "Rezept für schlechte Ideen": https://speakerdeck.com/mitsuhiko/5-years-of-bad-ideas?slide=58
quelle
def method(
<del> self </ del> enthalten ist, bei diesem cleveren Hack)
jedochself.variable
weiterhin erforderlich ist.Ja, Selbst ist langweilig. Aber ist es besser?
quelle
_
hat eine besondere Bedeutung in der Python-Shell, in der der zuletzt zurückgegebene Wert enthalten ist. Es ist sicher, es so zu verwenden, aber möglicherweise verwirrend; Ich würde es vermeiden.s
oderm
(um C ++ nachzuahmen)Von: Self Hell - Stateful Funktionen.
quelle
__str__
und dergleichen) zu zaubern / zu zerstören, da diese auf eine andere Weise als normale Methoden aufgerufen werden.Ich denke, dass es einfacher und lesbarer wäre, wenn es eine Anweisung "Mitglied" gäbe, genauso wie es "global" gibt, damit Sie dem Interpreter mitteilen können, welche Objekte Mitglieder der Klasse sind.
quelle