1338 Stimmen

Was ist der Zweck des Wortes 'self'?

Was ist der Zweck von self in Python? Ich verstehe, dass es sich auf das spezifische Objektinstanz bezieht, die aus dieser Klasse erstellt wurde. Aber warum muss es explizit als Parameter zu jeder Methode hinzugefügt werden?

Zur Veranschaulichung, in Ruby kann ich dies tun:

class MyClass
    def func(name)
        @name = name
    end

In Python muss ich jedoch self einschließen:

class MyClass:
    def func(self, name):
        self.name = name

48voto

ninjagecko Punkte 82995

Ich werde mit Code demonstrieren, der keine Klassen verwendet:

def state_init(state):
    state['field'] = 'init'

def state_add(state, x):
    state['field'] += x

def state_mult(state, x):
    state['field'] *= x

def state_getField(state):
    return state['field']

myself = {}
state_init(myself)
state_add(myself, 'added')
state_mult(myself, 2)

print( state_getField(myself) )
#--> 'initaddedinitadded'

Klassen sind nur eine Möglichkeit, dieses "state"-Ding nicht ständig übergeben zu müssen (und andere nette Dinge wie die Initialisierung, Klassenkomposition, die selten benötigten Metaklassen und die Unterstützung benutzerdefinierter Methoden zur Überschreibung von Operatoren).

Lassen Sie uns nun den obigen Code mit der integrierten Python-Klassenmechanik demonstrieren, um zu zeigen, wie es im Grunde dasselbe ist.

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x
    def mult(self, x):
        self.field *= x

s = State()
s.add('added')    # self wird implizit übergeben
s.mult(2)         # self wird implizit übergeben
print( s.field )

[Meine Antwort wurde von einer geschlossenen Duplikatfrage migriert]

22voto

Matthew Rankin Punkte 428336

Die folgenden Auszüge stammen aus der Python-Dokumentation über self:

Wie in Modula-3 gibt es keine Abkürzungen [in Python] zum Referenzieren der Elemente des Objekts aus seinen Methoden: Die Methodenfunktion wird mit einem expliziten ersten Argument deklariert, das das Objekt darstellt, das implizit durch den Aufruf bereitgestellt wird.

Oft wird das erste Argument einer Methode self genannt. Das ist nichts weiter als eine Konvention: Der Name self hat für Python überhaupt keine spezielle Bedeutung. Beachten Sie jedoch, dass durch Nichtbeachtung der Konvention Ihr Code möglicherweise für andere Python-Programmierer weniger lesbar ist, und es ist auch denkbar, dass ein Klassenbrowserprogramm geschrieben wird, das sich auf eine solche Konvention stützt.

Weitere Informationen finden Sie im Python-Dokumentationstutorial zu Klassen.

22voto

Ponkadoodle Punkte 5623

Außerdem ermöglicht es, auf überschriebene Methoden einfacher zuzugreifen; du kannst Klasse.eine_methode(inst) aufrufen.

Ein Beispiel, wo es nützlich ist:

Klasse C1(object):
    def __init__(self):
         print "C1 init"

Klasse C2(C1):
    def __init__(self): #überschreibt C1.__init__
        print "C2 init"
        C1.__init__(self) #aber wir wollen trotzdem, dass C1 die Klasse initialisiert

>>> C2()
"C2 init"
"C1 init"

18voto

Gaurav Nishant Punkte 181

Die Verwendung ist ähnlich wie die Verwendung des this Schlüsselworts in Java, d.h. um einen Verweis auf das aktuelle Objekt zu geben.

13voto

rassa45 Punkte 3400

Python ist im Gegensatz zu Java oder C++ keine Sprache, die für objektorientierte Programmierung entwickelt wurde.

Wenn in Python eine statische Methode aufgerufen wird, schreibt man einfach eine Methode mit regulären Argumenten darin.

class Animal():
    def staticMethod():
        print "Dies ist eine statische Methode"

Allerdings benötigt eine Objektmethode, die verlangt, dass Sie eine Variable erstellen, die ein Tier ist, in diesem Fall das Argument self

class Animal():
    def objectMethod(self):
        print "Dies ist eine Objektmethode, die eine Instanz einer Klasse benötigt"

Die self-Methode wird auch verwendet, um auf ein Variablenfeld innerhalb der Klasse zu verweisen.

class Animal():
    # animalName im Konstruktor erstellt
    def Animal(self):
        self.animalName = "";

    def getAnimalName(self):
        return self.animalName

In diesem Fall bezieht sich self auf die animalName-Variable der gesamten Klasse. MERKE: Wenn du eine Variable innerhalb einer Methode hast, funktioniert self nicht. Diese Variable existiert nur, solange die Methode ausgeführt wird. Um Felder zu definieren (die Variablen der gesamten Klasse), müssen sie AUSSERHALB der Klassenmethoden definiert werden.

Wenn Sie kein Wort von dem verstehen, was ich sage, dann googlen Sie "Objektorientierte Programmierung". Sobald Sie dies verstehen, werden Sie diese Frage nicht einmal stellen müssen :).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X