web-dev-qa-db-de.com

Python-Aufrufmethode ohne "self"

Also habe ich gerade erst angefangen, in Python zu programmieren, und ich verstehe nicht die ganze Begründung für "Selbst". Ich verstehe, dass es fast wie eine globale Variable verwendet wird, so dass Daten zwischen verschiedenen Methoden in der Klasse übergeben werden können. Ich verstehe nicht, warum Sie es verwenden müssen, wenn Sie eine andere Methode in derselben Klasse aufrufen. Wenn ich bereits in dieser Klasse bin, warum muss ich es dann sagen?

beispiel, wenn ich Folgendes habe: Warum brauche ich selbst alles ()?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"
25
Synaps3

Sie können auch Methoden in der Klasse static erstellen, sodass self nicht erforderlich ist. Verwenden Sie dies jedoch, wenn Sie das wirklich brauchen.

Deine:

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

statische Ausgabe:

class bla:
    @staticmethod
    def hello():
        bla.thing()

    @staticmethod
    def thing():
        print "hello"
17
Developer

Ein Grund besteht darin, auf die Methode der Instanz der Klasse besondere zu verweisen, in der der Code ausgeführt wird.

Dieses Beispiel kann helfen:

def hello():
    print "global hello"

class bla:
    def hello(self):
        self.thing()
        hello()

    def thing(self):
        print "hello"

b = bla()
b.hello()
>>> hello
global hello

Sie können sich das vorläufig als Namensraumauflösung vorstellen.

9

Die kurze Antwort lautet "weil Sie def thing(args) als globale Funktion oder als Methode einer anderen Klasse verwenden können. Nehmen Sie dieses (schreckliche) Beispiel:

def thing(args):
    print "Please don't do this."

class foo:
    def thing(self,args):
        print "No, really. Don't ever do this."

class bar:
    def thing(self,args):
        print "This is completely unrelated."

Das ist schlecht. Tu das nicht. Wenn Sie aber könnten, könnten Sie thing(args) und aufrufen, damit etwas passiert. Dies kann möglicherweise eine gute Sache sein, wenn Sie entsprechend planen:

class Person:
    def bio(self):
        print "I'm a person!"

class Student(Person):
    def bio(self):
        Person.bio(self)
        print "I'm studying %s" % self.major

Der obige Code macht es so, dass, wenn Sie ein Objekt der Student-Klasse erstellen und bio aufrufen, es all das tut, was geschehen wäre, wenn es sich bei der Person-Klasse um eine eigene bio handelt, die und heißt hinterher sein eigenes Ding machen.

Dies wird in die Vererbung und einige andere Dinge, die Sie vielleicht noch nicht gesehen haben, aber freuen uns darauf.

3
Ali Alkhatib

Für mich selbst wie ein Bereichsdefinierer, wobei self.foo () und self.bar die Funktion und den in der Klasse definierten Parameter angeben und nicht die Definitionen an den anderen Stellen.

0

Möglicherweise gibt es eine andere Funktion mit demselben Namen außerhalb Ihrer Klasse. self ist eine Objektreferenz 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.

0
D4NI3LS

Eine Spiegelung spiegelt den Unterschied zwischen Java und Python wider: Java könnte Methoden innerhalb von class ohne self verwenden, da der Aufruf einer Methode nur über class oder obj möglich ist, sodass der Weg zum Compiler frei ist. Dies kann zwar den Übersetzer von Python verwirren und benötigt viel Zeit, um die Symboltabelle über den gesamten Namensraum zur Laufzeit nachzuschlagen, da sowohl die Funktionsmethode als auch die Klassenmethode die potenziellen Kandidaten für einen Funktionsaufruf sind, wenn 'self' nicht verwendet wird. Wenn diese Methode verwendet wird, würde sich die Python-Geschwindigkeit im Vergleich zu C und Java erneut verlangsamen, was die Attraktivität beeinträchtigen könnte.

0
Jeno