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.
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).
__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.