Von dem, was ich lese/verstehe, ist der "self" -Parameter ähnlich "this".Python und mit 'self' in Methoden
Stimmt das?
Wenn es optional ist, was würden Sie tun, wenn nicht selbst in die Methode übergeben wurde?
Von dem, was ich lese/verstehe, ist der "self" -Parameter ähnlich "this".Python und mit 'self' in Methoden
Stimmt das?
Wenn es optional ist, was würden Sie tun, wenn nicht selbst in die Methode übergeben wurde?
In Klassen ist eine self
Variable (oder cls
für Klassenmethoden) erforderlich. Wie du es nennen willst, ist deine Entscheidung. Wenn Sie es vorziehen, könnten Sie es stattdessen this
nennen. Eine ist eine Methode, die class
als ein erstes Argument anstelle einer Instanz erhält. Es kann aufgerufen werden, ohne eine Instanz zu übergeben. das heißt mit einem classmethod
können Sie tun:
SomeObject.some_class_method()
während eine normale Methode Sie
SomeObject().some_normal_method()
or
SomeObject.some_normal_method(instance)
Ja, es verwendet wird auf ähnliche Weise zu tun, erfordern würde. Beachten Sie, dass es sich um einen Positionsparameter handelt, und Sie können es so nennen, wie Sie es möchten. Allerdings gibt es eine starke Konvention, es self
(nicht this
oder irgendetwas anderes) zu nennen. Einige Positionsparameter müssen für eine verwendbare Instanzmethode sein; Es ist nicht optional.
"Es muss da sein" könnte den Uneingeweihten nahelegen, dass es "selbst" ist. Ich möchte klarstellen, dass der erste Parameter da sein muss und auf eine Instanz des Objekts zeigen wird. Es wird per Konvention 'self' genannt, aber wenn Sie Code für einen verschleierten Programmierwettbewerb schreiben, könnten Sie ihn anders nennen. – extraneon
@extra, habe ich geklärt. –
self
ist this
, nur Sie müssen es explizit übergeben und explizit verwenden, um auf Klassenmethoden/Eigenschaften zu verweisen.
Es ist nicht optional in Klassenmethoden. Sie erhalten eine TypeError
, wenn Sie versuchen, eine Klassenmethode ohne mindestens ein Argument (d. H. Den self
Parameter) zu definieren.
Sie können es jedoch etwas anderes als self
nennen, aber ich habe nie anders gesehen.
Sie sollten umformulieren. ['classmethod'] (http://docs.python.org/library/functions.html#classmethod) ist etwas anderes. –
self
bezieht sich auf das Objekt, auf dem die Methode aufgerufen wurde, ähnlich wie this
in C++. Aber es ist wichtig, dass self
nur eine Konvention ist, können Sie es benennen, wie Sie möchten und Instanzen von Unterklassen übergeben.
Die Freude an dem Python
Das ist wahr, einige erweitern. Methoden sind gebunden an die Objektinstanz, zu der sie gehören.Wenn Sie
def some_func(self, foo, bar)
Die Weitergabe der Selbst sehen ist manchmal implizit, wenn Sie anrufen, zum Beispiel:
obj.some_func(foo_val, bar_val)
, der gleich (obj
Annahme der Klasse ist MyClass
) zu
MyClass.some_func(obj, foo_val, bar_val)
Da die Methode an obj
gebunden ist, wird das Argument self
ausgefüllt. Dies ist ein Teil von Python, was explizit bedeutet, was es bedeutet. In anderen Sprachen, this
erscheint nur in den Bereich, mit Python gibt es einige Enthüllungen darüber, wie dies geschieht.
Sie können auch Methoden übergeben und sie manuell übergeben self
, wenn nicht aus einem gebundenen Kontext aufrufen.
The Python docs do a good Job:
xf = x.f
while True:
print xf()
weiterhin Hallo Welt bis zum Ende der Zeit drucken.
Was genau passiert, wenn eine Methode aufgerufen wird? Sie haben vielleicht bemerkt, dass x.f()> ohne ein Argument oben aufgerufen wurde, obwohl die Funktionsdefinition für f() ein Argument> angegeben hat. Was ist mit dem Streit passiert? Sicherlich löst Python eine Ausnahme aus, wenn eine Funktion, die ein Argument benötigt, aufgerufen wird - auch wenn das Argument nicht tatsächlich verwendet wird ...
Tatsächlich haben Sie vielleicht die Antwort erraten: das Besondere an Methoden ist dass das> Objekt als erstes Argument der Funktion übergeben wird. In unserem Beispiel ist der Aufruf x.f()> genau gleich MyClass.f (x). Im Allgemeinen entspricht das Aufrufen einer Methode mit einer Liste von n Argumenten> dem Aufruf der entsprechenden Funktion mit einer Argumentliste, die erstellt wird, indem das Objekt der Methode vor dem ersten Argument eingefügt wird.
self
ist auf jeden Fall ähnlich wie this
jedoch in Python, der Name self
nur eine Konvention ist, und konnte nichts anderes genannt werden. Die Variable ist nach dem benannt, was Sie im Prototyp der Funktion (def function(whatever, params...):
) nennen.
Zum Beispiel Methoden, self
ist tatsächlich erforderlich. Für Klassen- oder statische Methoden müssen Sie angeben, dass sie als solche behandelt werden sollen, und dann ist self
nicht erforderlich. Zum Beispiel:
def type_to_display(type):
"""Converts a pass type to the full written pass type."""
return list((pair[1] for pair in Pass.TYPE_CHOICES if pair[0] ==
type[0:1].upper()))[0]
type_to_display = staticmethod(type_to_display)
Sie werden nie in eine Instanz Methode so zu bedienen, dass selbst geleitet wird, nicht in der Lage zum Beispiel, wenn ich eine Instanz my_car
einer Car
Klasse habe, und ich verwende die Car
. Klasse drive
Instanz Methode, die my_car
Instanz wird implizit in die drive
Methode als erster Parameter (self
) übergeben.
class Car:
def drive(self):
self.do_some_stuff()
my_car = Car()
my_car.drive() # actually calls Car.drive(my_car)
ruft es Car.drive (my_car) –
Bah, danke! Fest. –
cls ist für "Klassenmethoden", dh statische Methoden korrekt? – Blankman
Nein, in Python [statische Methoden] (http://docs.python.org/library/functions).html # staticmethod) sind unterschiedlich. –
@Matthew Flaschen ist richtig. Eine Klassenmethode erhält als ersten Parameter eine Referenz auf die Klasse, eine statische Methode hat keine erforderlichen Parameter. – danben