Python - __init__ und selbst was tun Sie?
Lerne ich die Programmiersprache Python und ich haben stieß auf etwas, was ich nicht ganz verstehen.
In eine Methode wie:
def method(self, blah):
def __init__(?):
....
....
Was bedeutet self
tun? Was sollte es werden? Ist es zwingend erforderlich?
Was bedeutet die __init__
Methode tun? Warum ist es notwendig? (usw.)
Ich denke, Sie könnte OOP-Konstrukte, aber ich weiß nicht sehr viel.
InformationsquelleAutor | 2009-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem code:
... die
self
variable stellt die Instanz des Objekts selbst. Die meisten Objekt-orientierten Sprachen übergeben, das als hidden-parameter für die Methoden definiert, die auf ein Objekt; Python nicht. Sie haben zu erklären, ihn explizit. Wenn Sie erstellen eine Instanz derA
Klasse und die Methoden aufrufen, es wird automatisch übergeben, als in ...Den
__init__
Methode ist ungefähr das, was repräsentiert einen Konstruktor in Python. Wenn Sie anrufenA()
Python erstellt ein Objekt für Sie, und übergibt als ersten parameter die__init__
Methode. Alle weiteren Parameter (z.B.A(24, 'Hello')
) wird auch erhalten, die als Argumente übergeben wurden-in diesem Fall verursacht eine Ausnahme ausgelöst wird, da der Konstruktor nicht erwartet.object
in die Deklaration der Klasse? Ich habe bemerkt, einige Klassen haben das und manche nichtEs ist für Python 2-Kompatibilität. In Python 3 gibt es keine Notwendigkeit, explizit Erben, von
object
da passiert es standardmäßig.def __init__(self): self.init() #Was bedeutet selbst.init() zu tun?
InformationsquelleAutor Chris B.
Yep, du hast Recht, diese sind oop-Konstrukte.
__init__
ist der Konstruktor für eine Klasse. Dieself
parameter bezieht sich auf die Instanz des Objekts (wiethis
in C++).Den
__init__
Methode wird aufgerufen, wenn der Speicher für das Objekt reserviert ist:Ist es wichtig, die
self
parameter innerhalb einer Methode eines Objekts, wenn Sie wollen, bestehen Sie den Wert mit dem Objekt. Wenn, zum Beispiel, implementieren Sie die__init__
Methode wie diese:Ihre
x
undy
Parameter werden gespeichert in der Variablen auf dem stack und würde verworfen werden, wenn der init-Methode geht out of scope. Die Einstellung dieser Variablen alsself._x
undself._y
setzt die Variablen, die als Mitglieder derPoint
Objekt (zugänglich für die Lebensdauer des Objekts).self
werden im Konstruktor? Warum glauben Sie noch haben, um es zu spezifizieren, wäre es nicht besser, wenn es implizit?InformationsquelleAutor RedBlueThing
Einem kurzen anschaulichen Beispiel
In der Hoffnung, es könnte helfen, ein wenig, hier ein einfaches Beispiel, das ich verwendet, um den Unterschied zu verstehen zwischen eine deklarierte variable innerhalb einer Klasse und einer variable deklariert, die innerhalb einer
__init__
Funktion:Das ist, was ich versucht habe zu erklären, näher zu mir selbst, " mit diesem Beispiel, dass die variable durch
__init__
ist, was wird übergeben an Instanzen von der Klasse, nicht den 'statischen' Variablen der Klasse selbst, die den gleichen Namen...InformationsquelleAutor Dave Everitt
Kurz:
self
wie es schon sagt, bezieht sich auf sich- das Objekt welches die Methode aufgerufen hat. Das ist, wenn man N Objekte aufrufen der Methode, dannself.a
beziehen sich auf eine separate Instanz-variable für jedes von N Objekten. Stellen Sie sich N Kopien der variablea
für jedes Objekt__init__
ist, was man als einen Konstruktor in anderen OOP-Sprachen wie C++/Java. Die grundlegende Idee ist, dass es ein Besondere Methode, die automatisch aufgerufen, wenn ein Objekt der Klasse erstellt wirdInformationsquelleAutor
__init__
handeln, wie ein Konstruktor. Sie müssen pass "self", um alle Funktionen der Klasse als erstes argument, wenn Sie wollen, dass Sie sich Verhalten wie nicht-statische Methoden. "selbst" sind Instanz-Variablen für die Klasse.InformationsquelleAutor ewalk
Probieren Sie diesen code. Hoffe, es hilft viele C-Programmierer wie mich zu Lernen, Py.
Ausgabe:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
Ich bin mir nicht klar über die doc Sache.. es tut ziehen Sie die Dokumentation? und wenn ich das mache: "'test - mein doc"', kann ich mit: drucken.p.__test__? oder ist der doc ein bestimmtes keyword?
InformationsquelleAutor Jayzcode
Hatte Mühe, undestanding diese selbst. Auch nach dem Lesen der Antworten hier.
Richtig verstehen, der
__init__
Methode, die Sie brauchen, um zu verstehen, selbst.Der self-Parameter
Die Argumente akzeptiert, die von der
__init__
Methode sind :Aber wir eigentlich nur übergeben Sie zwei Argumente :
Wo ist die extra-argument kommen ?
Wenn wir den Zugriff auf Attribute eines Objekts haben wir es zu tun mit der name (oder Referenz). Hier Instanz ist eine Referenz zu unserem neuen Objekt. Wir greifen auf die printargs Methode der Instanz-Objekt instance.printargs.
Werden, um Zugriff auf Objekt-Attribute innerhalb der
__init__
Methode benötigen wir eine Referenz auf das Objekt., Wenn eine Methode aufgerufen wird, eine Referenz auf das main-Objekt als erstes argument übergeben. Durch die Konvention, die Sie rufen immer das erste argument, um Ihre Methoden selbst.
Bedeutet dies in der
__init__
Methode, die wir tun können :Hier setzen wir Attribute auf das Objekt. Sie können dies überprüfen, indem Sie Folgendes tun :
Werte wie diese sind bekannt als Objekt-Attribute. Hier die
__init__
- Methode legt die arg1 und arg2 Attribute der Instanz.Quelle: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
InformationsquelleAutor eee
beachten Sie, dass
self
könnte man eigentlich jede gültige python-Bezeichner. Zum Beispiel, wir könnten genauso leicht schreiben-von Chris B Beispiel:und es funktionieren würde, genau das gleiche. Es wird jedoch empfohlen, mit sich selbst, weil andere pythoners wird Sie leichter erkennen.
InformationsquelleAutor SingleNegationElimination
Die Objekte der Klasse unterstützen zwei Arten von Operationen: Attribut-Referenzen und Instanziierung
Attribut-Referenzen verwenden die standard-syntax, die für alle Attribut-Referenzen in Python: obj.name. Gültige Attributnamen sind all die Namen, die waren in der Klasse namespace, wenn das class-Objekt erstellt wurde. Also, wenn die definition der Klasse wie folgt aussah:
dann
MyClass.i
undMyClass.f
sind gültige Attribut-Referenzen, die eine Ganzzahl und ein Funktions-Objekt, beziehungsweise. Klassenattribute kann auch zugewiesen werden, so können Sie ändern Sie den Wert vonMyClass.i
durch Abtretung.__doc__
ist auch ein gültiges Attribut, Rücksendung der docstring die Zugehörigkeit zu der Klasse: "A simple example class".Klasse Instanziierung verwendet die Funktion notation. Einfach so tun, dass das class-Objekt eine parameterlose Funktion gibt eine neue Instanz der Klasse. Zum Beispiel:
Den Instanziierung - Betrieb ("calling") ein class-Objekt) erzeugt ein leeres Objekt. Viele Klassen erstellen Objekte mit Instanzen individuell auf einen bestimmten Ausgangszustand. Also eine Klasse definieren, die eine spezielle Methode mit dem Namen
__init__()
wie diese:Wenn eine Klasse definiert eine
__init__()
Methode, Klasse Instanziierung automatisch aufgerufen__init__()
für die neu erstellte Instanz der Klasse. So in diesem Beispiel, eine neue, initialisierte Instanz kann erreicht werden durch:Natürlich, die
__init__()
Methode können Argumente für mehr Flexibilität. In diesem Fall, die Argumente vor der Klasse instantiation operator weitergegeben werden, um__init__()
. Zum Beispiel,Entnommen aus offiziellen Dokumentation, der mir geholfen hat den meisten am Ende.
Hier ist mein Beispiel
Wenn Sie erstellen Sie eine Instanz der Klasse Rechnung:
Erhalten Sie:
InformationsquelleAutor Harvey
Im Grunde, Sie müssen verwenden Sie die 'selbst' - Schlüsselwort beim verwenden einer Variablen in mehreren Funktionen innerhalb der selben Klasse. Für init, es verwendet, um die setup-default-Werte, sofern keine anderen Funktionen innerhalb dieser Klasse aufgerufen werden.
selbst als Platzhalter verwendet grundsätzlich. Es ist nicht erforderlich, dass Sie selbst, Sie könnte "eeee" oder "foo" oder etwas anderes, es ist nur zu empfehlen für andere Programmierer beim Lesen Ihres Codes
InformationsquelleAutor user1675111
__init__
ist im Grunde eine Funktion, die "initialisieren"/"aktivieren" die Eigenschaften der Klasse für ein bestimmtes Objekt einmal erstellt und abgestimmt werden, um die entsprechende Klasse..self
stellt das Objekt die Erben diese Eigenschaften.InformationsquelleAutor bishop
Das 'selbst' ist ein Verweis auf die Instanz der Klasse
Nun erstellen wir eine Instanz von foo und rufen Sie die Methode auf, die self-parameter Hinzugefügt werden, indem Sie Python in diesem Fall:
Aber es kann übergeben, wenn die Methode nennen, nicht in den Kontext einer Instanz der Klasse, die den code unten tut das gleiche
Interessanterweise den Namen der Variablen 'selbst' ist nur eine Konvention. Die nachstehenden definition wird funktionieren genau das gleiche.. gesagt Haben, dass es sehr starke Konvention, die befolgt werden sollten immer, aber es sagt etwas über das flexible Natur der Sprache
Wie ich schrieb in meiner Antwort "bar" ist nur eine Funktion, wo eine Instanz der Klasse ist, die als der erste parameter. Während also die "bar" ist definiert als eine Methode gebunden "foo" könnte es auch genannt werden, mit einer Instanz von einer anderen Klasse. Dies ist nicht, wie Methoden und "diese" work in Java zum Beispiel, obwohl ich mir vorstellen, Sie sehen, dass diese das gleiche Konzept, die Funktionen und einige der Instanz-Kontext (den Instanz-Kontext wird der erste parameter in Python und "this" in Java"). Vielleicht sehen Sie jetzt die Flexibilität der Sprache, die ich meinte?
Ja, das zeigt die Flexibilität der Sprache. Die Art und Weise, Sie formuliert Ihre Antwort, es schien, wie Sie sagten, dass die Tatsache, dass Sie nennen könnte, den "self" - variable etwas anderes (wie
s
) wurde, welche die Flexibilität von python.InformationsquelleAutor tarn
InformationsquelleAutor Manohar Reddy Poreddy
In diesem code:
Hier
__init__
wirkt wie ein Konstruktor für die Klasse, und wenn ein Objekt instanziiert wird, wird diese Funktion aufgerufen.self
stellt die Instanziierung Objekt.Das Ergebnis der oben genannten Aussagen werden wie folgt:
InformationsquelleAutor Anagha
Nur eine demo für die Frage.
InformationsquelleAutor debug
Dem gegebenen Beispiel ist nicht korrekt, lassen Sie mich so erstellen Sie eine korrekte Beispiel basiert auf:
Wenn wir erstellen eine Instanz des Objekts, die
__init__
heißt anpassen, das Objekt, nachdem es erstellt wurde. Das heißt, wenn wir rufenSomeObject
mit'blah'
unten (könnte alles sein), wird es an die__init__
Funktion als argument,blah
:Den
self
argument ist die Instanz vonSomeObject
zugewiesenan_object
.Später, wir wollen vielleicht rufen Sie eine Methode auf diesem Objekt:
Tun, die gepunktete lookup, das ist
an_object.method
bindet die Instanz an eine Instanz von der Funktion und der Methode (wie oben genannt) ist jetzt ein "bound" - Methode - das heißt, wir müssen nicht explizit übergeben Sie die Instanz an die Methode call.Aufruf der Methode wird die Instanz weil es gebunden war, auf der gepunkteten lookup, und wenn Sie aufgerufen wird, führt dann den gewünschten code programmiert wurde es zu führen.
Implizit übergeben
self
argument aufgerufen wirdself
durch Konvention. Wir können jede andere juristische Python Namen, aber Sie wird wahrscheinlich geteert und gefedert durch andere Python-Programmierer, wenn Sie es ändern, um etwas anderes.__init__
ist eine spezielle Methode, dokumentiert in der Python-datamodel-Dokumentation. Es wird sofort aufgerufen, nachdem die Instanz erstellt wird (in der Regel über__new__
- obwohl__new__
ist nicht erforderlich, es sei denn, Sie sind Unterklassen einer unveränderlichen Datentyp).InformationsquelleAutor Aaron Hall
Das erste argument jeder Methode der Klasse, einschließlich init, ist immer eine Referenz auf die aktuelle Instanz der Klasses. Per Konvention wird dieses argument immer den Namen selbst.In der init-Methode self bezieht sich auf das neu erstellte Objekt; in einer anderen Klasse Methoden, es bezieht sich auf die Instanz, deren Methode aufgerufen wurde.
Python nicht zwingen, Sie über die Verwendung "selbst". Sie können geben Sie einen beliebigen Namen Sie wollen. Aber denken Sie daran, dass das erste argument in einer Methode definition eine Referenz auf das Objekt.Python fügt der self-argument, um die Liste für Sie; Sie brauchen nicht, um es einzufügen, wenn Sie die Methoden aufrufen.
wenn Sie nicht selbst in der init-Methode dann erhalten Sie eine Fehlermeldung,
init kurzen für die Initialisierung. Es ist ein Konstruktor, der aufgerufen wird, wenn Sie Instanz der Klasse und es ist nicht notwendig,. Aber normalerweise ist es unsere Praxis zu schreiben init-Methode für die Einstellung der Standard-Zustand des Objekts. Wenn Sie nicht bereit sind, irgendwelche Zustand des Objekts zunächst, dann brauchen Sie nicht zu schreiben, diese Methode.
InformationsquelleAutor Muhammad Faizan Khan
Hier, der Kerl hat Recht gut geschrieben und einfach: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Obige link als Referenz:
InformationsquelleAutor Laxmikant