In diesem Code:
class A(object):
def __init__(self):
self.x = 'Hello'
def method_a(self, foo):
print self.x + ' ' + foo
... die self
Variable repräsentiert die Instanz des Objekts selbst. Die meisten objektorientierten Sprachen übergeben dies als versteckten Parameter an die für ein Objekt definierten Methoden. Python nicht. Sie müssen es explizit deklarieren. Wenn Sie eine Instanz der A
Klasse erstellen 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 entspricht in etwa einem Konstruktor in Python. Wenn Sie A()
Python aufrufen, wird ein Objekt für Sie erstellt und als erster Parameter an die __init__
Methode übergeben. Alle zusätzlichen 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.
x = 'Hello'
außerhalb von init, aber innerhalb der Klasse setzen? Ist es wie Java, wo es dasselbe ist, oder wird es wie eine statische Variable, die nur einmal initialisiert wird?A.x
oder verfügbara.x
. Beachten Sie, dass das Überschreiben einer bestimmten Klasse keine Auswirkungen auf die Basis hat.A.x = 'foo'; a.x = 'bar'; print a.x; print A.x
Drucken Siebar
dannfoo
self
, sondern nur durch Konvention.object
die Klassendeklaration? Ich habe bemerkt, dass einige Klassen dies haben und andere nichtobject
da dies standardmäßig geschieht.Ja, Sie haben Recht, das sind oop Konstrukte.
__init__
ist der Konstruktor für eine Klasse. Derself
Parameter bezieht sich auf die Instanz des Objekts (wiethis
in C ++).Die
__init__
Methode wird aufgerufen, wenn Speicher für das Objekt zugewiesen wird:Es ist wichtig, den
self
Parameter in der Methode eines Objekts zu verwenden, wenn Sie den Wert für das Objekt beibehalten möchten. Wenn Sie die__init__
Methode beispielsweise folgendermaßen implementieren :Ihre
x
undy
Parameter werden in Variablen auf dem Stapel gespeichert und verworfen, wenn die init-Methode den Gültigkeitsbereich verlässt. Festlegen dieser Variablen alsself._x
und Festlegen dieser Variablen alsself._y
Mitglieder desPoint
Objekts (Zugriff für die Lebensdauer des Objekts).quelle
self
im Konstruktor sein möchten ? Warum müssen Sie es überhaupt angeben, wäre es nicht besser, wenn es implizit wäre?Ein kurzes anschauliches Beispiel
In der Hoffnung, dass es ein wenig helfen könnte, hier ein einfaches Beispiel, mit dem ich den Unterschied zwischen einer in einer Klasse deklarierten Variablen und einer in einer
__init__
Funktion deklarierten Variablen verstanden habe :Ausgabe:
quelle
__init__
an Instanzen der Klasse übergeben wird, nicht an die 'statische' Variable der Klasse selbst, die denselben Namen hat ...Zusamenfassend:
self
bezieht sich, wie es nahelegt, auf sich selbst - das Objekt, das die Methode aufgerufen hat. Das heißt, wenn Sie N Objekte haben, die die Methode aufrufen,self.a
verweist dies für jedes der N Objekte auf eine separate Instanz der Variablen. Stellen Sie sich N Kopien der Variablena
für jedes Objekt vor__init__
wird in anderen OOP-Sprachen wie C ++ / Java als Konstruktor bezeichnet. Die Grundidee ist, dass es sich um eine spezielle Methode handelt, die automatisch aufgerufen wird, wenn ein Objekt dieser Klasse erstellt wirdquelle
__init__
verhält sich wie ein Konstruktor. Sie müssen "self" als erstes Argument an alle Klassenfunktionen übergeben, wenn Sie möchten, dass sie sich als nicht statische Methoden verhalten. "self" sind Instanzvariablen für Ihre Klasse.quelle
Probieren Sie diesen Code aus. Ich hoffe, es hilft vielen C-Programmierern wie mir, Py zu lernen.
Ausgabe:
Jay
Sum = 5
Doc - Inside Class
Doc - __init__ Constructor
Doc - Inside Show
Destructor Deleting object - Jay
quelle
Klassenobjekte unterstützen zwei Arten von Operationen: Attributreferenzen und Instanziierung
Attributreferenzen verwenden die Standardsyntax, die für alle Attributreferenzen in Python verwendet wird: obj.name. Gültige Attributnamen sind alle Namen, die sich beim Erstellen des Klassenobjekts im Namespace der Klasse befanden. Wenn also die Klassendefinition so aussah:
dann
MyClass.i
undMyClass.f
sind gültige Attributreferenzen, die eine Ganzzahl bzw. ein Funktionsobjekt zurückgeben. Klassenattribute können auch zugewiesen werden, sodass Sie den Wert vonMyClass.i
durch Zuweisung ändern können .__doc__
ist auch ein gültiges Attribut, das den zur Klasse gehörenden Dokumentstring zurückgibt: "Eine einfache Beispielklasse".Die Klasseninstanziierung verwendet die Funktionsnotation. Stellen Sie sich einfach vor, das Klassenobjekt sei eine parameterlose Funktion, die eine neue Instanz der Klasse zurückgibt. Zum Beispiel:
Die Instanziierungsoperation ("Aufrufen" eines Klassenobjekts) erstellt ein leeres Objekt. Viele Klassen erstellen gerne Objekte mit Instanzen, die an einen bestimmten Anfangszustand angepasst sind. Daher kann eine Klasse eine spezielle Methode mit folgendem Namen definieren
__init__()
:Wenn eine Klasse eine
__init__()
Methode definiert , wird die Klasseninstanziierung automatisch__init__()
für die neu erstellte Klasseninstanz aufgerufen. In diesem Beispiel kann eine neue, initialisierte Instanz erhalten werden durch:Natürlich kann die
__init__()
Methode Argumente für eine größere Flexibilität haben. In diesem Fall werden Argumente, die dem Klasseninstanziierungsoperator gegeben wurden, an weitergeleitet__init__()
. Zum Beispiel,Entnommen aus offiziellen Unterlagen, die mir am Ende am meisten geholfen haben.
Hier ist mein Beispiel
Wenn Sie eine Instanz der Klasse Bill erstellen:
Du erhältst:
quelle
Hatte Probleme, das selbst zu verstehen. Auch nach dem Lesen der Antworten hier.
Um die
__init__
Methode richtig zu verstehen , müssen Sie sich selbst verstehen.Der Selbstparameter
Die von der
__init__
Methode akzeptierten Argumente sind:Aber wir geben nur zwei Argumente an:
Woher kommt das zusätzliche Argument?
Wenn wir auf Attribute eines Objekts zugreifen, geschieht dies nach Name (oder Referenz). Hier ist die Instanz ein Verweis auf unser neues Objekt. Wir greifen mit instance.printargs auf die printargs-Methode des Instanzobjekts zu.
Um innerhalb der
__init__
Methode auf Objektattribute zugreifen zu können, benötigen wir einen Verweis auf das Objekt.Bei jedem Aufruf einer Methode wird als erstes Argument ein Verweis auf das Hauptobjekt übergeben. Konventionell nennen Sie dieses erste Argument immer Ihre Methoden selbst.
Dies bedeutet in der
__init__
Methode, die wir tun können:Hier setzen wir Attribute für das Objekt. Sie können dies überprüfen, indem Sie folgende Schritte ausführen:
Werte wie diese werden als Objektattribute bezeichnet. Hier
__init__
legt die Methode die Attribute arg1 und arg2 der Instanz fest.Quelle: http://www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method
quelle
Beachten Sie, dass
self
dies tatsächlich eine gültige Python-ID sein kann. Zum Beispiel könnten wir genauso gut aus Chris Bs Beispiel schreiben:und es würde genauso funktionieren. Es wird jedoch empfohlen, self zu verwenden, da andere Python-Benutzer dies leichter erkennen.
quelle
Grundsätzlich müssen Sie das Schlüsselwort 'self' verwenden, wenn Sie eine Variable in mehreren Funktionen innerhalb derselben Klasse verwenden. Wie für init , wird es auf Standardwerte des Setup incase keine anderen Funktionen innerhalb dieser Klasse verwendet werden , genannt.
quelle
__init__
ist im Grunde eine Funktion, die die Eigenschaften der Klasse für ein bestimmtes Objekt "initialisiert" / "aktiviert" , sobald sie erstellt und mit der entsprechenden Klasse abgeglichen wurde.self
stellt das Objekt dar, das diese Eigenschaften erbt.quelle
Das 'Selbst' ist eine Referenz auf die Klasseninstanz
Jetzt können wir eine Instanz von foo erstellen und die Methode darauf aufrufen. In diesem Fall wird der Parameter self von Python hinzugefügt:
Es kann aber auch übergeben werden, wenn der Methodenaufruf nicht im Kontext einer Instanz der Klasse steht. Der folgende Code macht dasselbe
Interessanterweise ist der Variablenname 'self' nur eine Konvention. Der folgende Definition wird funktionieren genau die gleiche .. Having said , dass es sehr starke Konvention , die befolgt werden soll , immer , aber es sagt etwas über flexible Art der Sprache
quelle
s
) bezeichnen könnten , die Flexibilität von Python zeigt.Nur eine Demo für die Frage.
quelle
In diesem Code:
Hier
__init__
fungiert er als Konstruktor für die Klasse, und wenn ein Objekt instanziiert wird, wird diese Funktion aufgerufen.self
repräsentiert das instanziierende Objekt.Das Ergebnis der obigen Aussagen ist wie folgt:
quelle
Das erste Argument jeder Klassenmethode, einschließlich init, ist immer ein Verweis auf die aktuelle Instanz der Klasse . Konventionell wird dieses Argument immer benannt
self
.self
Bezieht sich in der init-Methode auf das neu erstellte Objekt. In anderen Klassenmethoden bezieht es sich auf die Instanz, deren Methode aufgerufen wurde.Python zwingt Sie nicht dazu, " self " zu verwenden. Sie können ihm einen beliebigen Namen geben. Denken Sie jedoch daran, dass das erste Argument in einer Methodendefinition eine Referenz auf das Objekt ist . Python fügt das
self
Argument der Liste für Sie hinzu. Sie müssen es nicht einschließen, wenn Sie die Methoden aufrufen. Wenn Sie in der init-Methode nicht self angegeben haben, wird eine Fehlermeldung angezeigtinit
steht für Initialisierung. Es ist ein Konstruktor, der aufgerufen wird, wenn Sie eine Instanz der Klasse erstellen, und der nicht erforderlich ist . Normalerweise ist es jedoch unsere Praxis, eine init-Methode zum Festlegen des Standardstatus des Objekts zu schreiben. Wenn Sie zunächst keinen Status des Objekts festlegen möchten, müssen Sie diese Methode nicht schreiben.quelle
quelle
Das angegebene Beispiel ist nicht korrekt. Lassen Sie mich darauf basierend ein korrektes Beispiel erstellen:
Wenn wir eine Instanz des Objekts erstellen, wird das
__init__
aufgerufen, um das Objekt nach seiner Erstellung anzupassen. Das heißt, wenn wirSomeObject
mit'blah'
unten aufrufen (was alles sein könnte), wird es__init__
als Argument an die Funktion übergebenblah
:Das
self
Argument ist die InstanzSomeObject
, der zugewiesen wirdan_object
.Später möchten wir möglicherweise eine Methode für dieses Objekt aufrufen:
Durch die gepunktete Suche wird
an_object.method
die Instanz an eine Instanz der Funktion gebunden, und die Methode (wie oben aufgerufen) ist jetzt eine "gebundene" Methode. Dies bedeutet, dass wir die Instanz nicht explizit an den Methodenaufruf übergeben müssen .Der Methodenaufruf ruft die Instanz ab, weil sie an die gepunktete Suche gebunden war, und führt beim Aufruf den Code aus, für den sie programmiert wurde.
Das implizit übergebene
self
Argument wirdself
durch Konvention aufgerufen . Wir könnten jeden anderen legalen Python-Namen verwenden, aber Sie werden wahrscheinlich von anderen Python-Programmierern geteert und gefiedert, wenn Sie ihn in etwas anderes ändern.__init__
ist eine spezielle Methode, die in der Dokumentation zum Python-Datenmodell dokumentiert ist . Es wird unmittelbar nach dem Erstellen der Instanz aufgerufen (normalerweise über__new__
- obwohl dies__new__
nur erforderlich ist, wenn Sie einen unveränderlichen Datentyp unterklassifizieren).quelle
Hier hat der Typ ziemlich gut und einfach geschrieben: https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
Lesen Sie den obigen Link als Hinweis darauf:
quelle