2010-07-19 4 views
6

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?

Antwort

0

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) 
+0

cls ist für "Klassenmethoden", dh statische Methoden korrekt? – Blankman

+4

Nein, in Python [statische Methoden] (http://docs.python.org/library/functions).html # staticmethod) sind unterschiedlich. –

+0

@Matthew Flaschen ist richtig. Eine Klassenmethode erhält als ersten Parameter eine Referenz auf die Klasse, eine statische Methode hat keine erforderlichen Parameter. – danben

5

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.

+0

"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

+0

@extra, habe ich geklärt. –

2

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.

+1

Sie sollten umformulieren. ['classmethod'] (http://docs.python.org/library/functions.html#classmethod) ist etwas anderes. –

0

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.

3

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.

0

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) 
+0

ruft es Car.drive (my_car) –

+0

Bah, danke! Fest. –

Verwandte Themen