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

13voto

Akash Kandpal Punkte 2544

Zunächst einmal ist self ein konventioneller Name, den du durch irgendetwas anderes ersetzen könntest (logischerweise).

Es bezieht sich auf das Objekt selbst, also wenn du es verwendest, erklärst du, dass .name und .age Eigenschaften der Studentenobjekte (nicht der Studentenklasse) sind, die du erstellen wirst.

class Student:
    #wird jedes Mal aufgerufen, wenn du eine neue Studenteninstanz erstellst
    def __init__(self,name,age): #spezielle Methode zur Initialisierung
        self.name=name
        self.age=age

    def __str__(self): #spezielle Methode, die beispielsweise aufgerufen wird, wenn du print verwendest
        return "Student %s ist %s Jahre alt" %(self.name,self.age)

    def call(self, msg): #albernes Beispiel für benutzerdefinierte Methode
        return ("Hey, %s! "+msg) %self.name

#Initialisierung zweier Instanzen der Studentenklasse
bob=Student("Bob",20)
alice=Student("Alice",19)

#Anwendung
print bob.name
print bob.age
print alice #das funktioniert nur, wenn du die __str__ Methode definierst
print alice.call("Komm her!") #beachte, dass du keinen Wert für self angibst

#du kannst Attribute ändern, zum Beispiel wenn Alice älter wird
alice.age=20
print alice

Der Code ist hier zu finden

11voto

dan-klasson Punkte 12870

Es ist da, um dem Python-Zen zu folgen "explizit ist besser als implizit". Es handelt sich tatsächlich um eine Referenz auf Ihr Klassenobjekt. In Java und PHP wird es zum Beispiel als this bezeichnet.

Wenn user_type_name ein Feld in Ihrem Modell ist, greifen Sie darauf zu, indem Sie self.user_type_name verwenden.

11voto

Ming-Tang Punkte 16979

self ist ein Objektverweis auf das Objekt selbst, daher sind sie gleich. Python-Methoden werden nicht im Kontext des Objekts selbst aufgerufen. self in Python kann verwendet werden, um mit benutzerdefinierten Objektmodellen oder ähnlichem umzugehen.

8voto

kmario23 Punkte 49380

Schauen Sie sich das folgende Beispiel an, das den Zweck von self klar erläutert

class Restaurant(object):  
    bankrott = False

    def open_branch(self):
        if not self.bankrott:
           print("Filiale eröffnet")

#Instanz1 erstellen
>>> x = Restaurant()
>>> x.bankrott
False

#Instanz2 erstellen
>>> y = Restaurant()
>>> y.bankrott = True   
>>> y.bankrott
True

>>> x.bankrott
False  

self wird verwendet/gebraucht, um zwischen den Instanzen zu unterscheiden.

Quelle: Die self-Variable in Python erklärt - Pythontips

8voto

user441521 Punkte 6674

Es überrascht mich, dass niemand Lua erwähnt hat. Lua verwendet auch die Variable 'self', jedoch kann sie ausgelassen, aber dennoch verwendet werden. C++ macht das Gleiche mit 'this'. Ich sehe keinen Grund, 'self' in jeder Funktion deklarieren zu müssen, aber du solltest trotzdem in der Lage sein, sie genauso zu nutzen, wie du es mit Lua und C++ kannst. Für eine Sprache, die stolz darauf ist, knapp zu sein, ist es seltsam, dass sie dich zur Deklaration der self-Variablen zwingt.

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