Was machen __init__ und self bei Python?

Ich lerne gerade die Programmiersprache Python und bin auf etwas gestoßen, das ich nicht ganz verstehe.

In einer Methode wie:

def method(self, blah):
    def __init__(?):
        ....
    ....

Was macht self? Was soll es sein? Ist es obligatorisch?

Was macht die Methode __init__? Warum ist sie notwendig? (usw.)

Ich denke, dass es sich um OOP-Konstrukte handeln könnte, aber ich weiß nicht sehr viel.

In diesem Code:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... steht die Variable self für die Instanz des Objekts selbst. Die meisten objektorientierten Sprachen übergeben diese Variable als versteckten Parameter an die für ein Objekt definierten Methoden; Python tut dies nicht. Sie müssen sie explizit deklarieren. Wenn Sie eine Instanz der Klasse A erzeugen und ihre Methoden aufrufen, wird sie automatisch übergeben, wie in ...

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

Die __init__-Methode ist ungefähr das, was in Python einen Konstruktor darstellt. Wenn Sie A() aufrufen, erzeugt Python ein Objekt für Sie und übergibt es als ersten Parameter an die __init__-Methode. Alle weiteren Parameter (z.B. A(24, 'Hello')) werden ebenfalls als Argumente übergeben - in diesem Fall wird eine Ausnahme ausgelöst, da der Konstruktor sie nicht erwartet.

Kommentare (3)

Ja, Sie haben recht, das sind Oop-Konstrukte.

__init__ ist der Konstruktor für eine Klasse. Der Parameter "self" bezieht sich auf die Instanz des Objekts (wie "this" in C++).

class Point:
    def __init__(self, x, y):
        self._x = x
        self._y = y

Die Methode __init__ wird aufgerufen, wenn Speicher für das Objekt zugewiesen wird:

x = Point(1,2)

Es ist wichtig, den self-Parameter innerhalb der Methode eines Objekts zu verwenden, wenn Sie den Wert mit dem Objekt aufrechterhalten wollen. Wenn Sie zum Beispiel die __init__ Methode wie folgt implementieren:

class Point:
    def __init__(self, x, y):
        _x = x
        _y = y

Die Parameter x und y würden in Variablen auf dem Stack gespeichert und verworfen werden, wenn die init-Methode den Anwendungsbereich verlässt. Das Setzen dieser Variablen als self._x und self._y setzt diese Variablen als Mitglieder des Point-Objekts (zugänglich während der Lebensdauer des Objekts).

Kommentare (1)

__init__ verhält sich wie ein Konstruktor. Sie müssen "self" an alle Klassenfunktionen als erstes Argument übergeben, wenn Sie wollen, dass sie sich wie nicht-statische Methoden verhalten. "self" sind Instanzvariablen für Ihre Klasse.

Kommentare (1)