it-swarm.com.de

Was ist eine "Methode" in Python?

Kann mir jemand bitte ganz einfach erklären, was eine "Methode" in Python ist?

In vielen Python-Tutorials für Anfänger wird dieses Wort so verwendet, als ob der Anfänger bereits wusste, was eine Methode im Kontext von Python ist. Ich bin zwar mit der allgemeinen Bedeutung dieses Wortes vertraut, weiß jedoch nicht, was dieser Begriff in Python bedeutet. Erklären Sie mir also, worum es bei der "Pythonian" -Methode geht.

Ein sehr einfacher Beispielcode würde sehr geschätzt, da ein Bild mehr als tausend Worte wert ist.

65
brilliant

Es ist eine Funktion, die Mitglied einer Klasse ist:

class C:
    def my_method(self):
        print "I am a C"

c = C()
c.my_method()  # Prints "I am a C"

So einfach ist das!

(Es gibt auch einige alternative Methoden, mit denen Sie die Beziehung zwischen der Klasse und der Funktion steuern können. Aber ich schätze aus Ihrer Frage, dass Sie nicht danach fragen, sondern nur die Grundlagen.)

75
RichieHindle

Eine Methode ist eine Funktion, die eine Klasseninstanz als ersten Parameter verwendet. Methoden sind Mitglieder von Klassen.

class C:
    def method(self, possibly, other, arguments):
        pass # do something here

Da Sie wissen wollten, was es in Python konkret bedeutet, können Sie zwischen gebundenen und ungebundenen Methoden unterscheiden. In Python sind alle Funktionen (und damit auch Methoden) Objekte, die herumgereicht und "gespielt" werden können. Der Unterschied zwischen ungebundenen und gebundenen Methoden ist also:

1) Gebundene Methoden

# Create an instance of C and call method()
instance = C()

print instance.method # prints '<bound method C.method of <__main__.C instance at 0x00FC50F8>>'
instance.method(1, 2, 3) # normal method call

f = instance.method
f(1, 2, 3) # method call without using the variable 'instance' explicitly

Gebundene Methoden sind Methoden, die zu Instanzen einer Klasse gehören. In diesem Beispiel ist instance.method an die Instanz instance gebunden. Bei jedem Aufruf dieser gebundenen Methode wird die Instanz automatisch als erster Parameter übergeben - der Konvention zufolge self.

2) Ungebundene Methoden

print C.method # prints '<unbound method C.method>'
instance = C()
C.method(instance, 1, 2, 3) # this call is the same as...
f = C.method
f(instance, 1, 2, 3) # ..this one...

instance.method(1, 2, 3) # and the same as calling the bound method as you would usually do

Wenn Sie auf C.method (die Methode innerhalb einer Klasse statt einer Instanz) zugreifen, erhalten Sie eine ungebundene Methode. Wenn Sie es aufrufen wollen, müssen Sie die Instanz als ersten Parameter übergeben, da die Methode nicht an eine Instanz gebunden ist.

Wenn Sie diesen Unterschied kennen, können Sie Funktionen/Methoden als Objekte verwenden, beispielsweise um Methoden herumzuleiten. Stellen Sie sich als Beispiel eine API vor, mit der Sie eine Rückruffunktion definieren können, aber Sie möchten eine Methode als Rückruffunktion bereitstellen. Kein Problem, übergeben Sie einfach self.myCallbackMethod als Rückruf und es wird automatisch mit der Instanz als erstes Argument aufgerufen. Dies ist in statischen Sprachen wie C++ (oder nur mit Tricks) nicht möglich.

Ich hoffe, Sie haben den Punkt verstanden;) Ich denke, das ist alles, was Sie über Methodengrundlagen wissen sollten. Sie könnten auch mehr über die Dekorateure classmethod und staticmethod lesen, aber das ist ein anderes Thema.

36
AndiDog

In Python ist eine Methode eine Funktion, die für ein gegebenes Objekt aufgrund des Objekttyps verfügbar ist.

Wenn Sie beispielsweise my_list = [1, 2, 3] erstellen, kann die append-Methode auf my_list angewendet werden, da es sich um eine Python-Liste handelt: my_list.append(4). Alle Listen haben eine append-Methode, einfach weil sie Listen sind.

Wenn Sie beispielsweise my_string = 'some lowercase text' erstellen, kann die upper-Methode auf my_string angewendet werden, einfach weil es sich um eine Python-Zeichenfolge handelt: my_string.upper().

Listen haben keine upper-Methode und Strings haben keine append-Methode. Warum? Weil Methoden nur für ein bestimmtes Objekt existieren, wenn sie explizit für diesen Objekttyp definiert sind und die Entwickler von Python (bisher) entschieden haben, dass diese bestimmten Methoden für diese bestimmten Objekte nicht benötigt werden.

Um eine Methode aufzurufen, ist das Format object_name.method_name() und alle Argumente für die Methode sind in Klammern aufgeführt. Die Methode wirkt implizit auf das benannte Objekt, und daher haben einige Methoden keine angegebenen Argumente, da das Objekt selbst das einzige erforderliche Argument ist. Zum Beispiel hat my_string.upper() keine aufgelisteten Argumente, da das einzige erforderliche Argument das Objekt selbst ist, my_string.

Ein gemeinsamer Punkt der Verwirrung betrifft Folgendes:

import math
math.sqrt(81)

Ist sqrt eine Methode des math-Objekts? Nr. So rufen Sie die sqrt-Funktion vom math-Modul auf. Das verwendete Format ist module_name.function_name() anstelle von object_name.method_name(). Im Allgemeinen besteht die einzige Möglichkeit, die beiden Formate (visuell) zu unterscheiden, darin, den Rest des Codes zu untersuchen und festzustellen, ob der Teil vor dem Punkt (math, my_list, my_string) als Objekt definiert ist oder ein Modul.

20
Kevin Markham

Tut mir leid, aber meiner Meinung nach hat RichieHindle vollkommen Recht, diese Methode zu sagen ...

Es ist eine Funktion, die Mitglied einer Klasse ist.

Hier ist das Beispiel einer Funktion, die zum Mitglied der Klasse wird. Seitdem verhält es sich als Methode der Klasse. Beginnen wir mit der Klasse empty und der normalen Funktion mit einem Argument:

>>> class C:
...     pass
...
>>> def func(self):
...     print 'func called'
...
>>> func('whatever')
func called

Jetzt fügen wir der C-Klasse einen Member hinzu, der die Referenz auf die Funktion darstellt. Danach können wir die Instanz der Klasse erstellen und ihre Methode so aufrufen, als wäre sie innerhalb der Klasse definiert:

>>> C.func = func
>>> o = C()
>>> o.func()
func called

Wir können auch die alternative Methode verwenden, um die Methode aufzurufen:

>>> C.func(o)
func called

Der o.func manifestiert sich sogar genauso wie die Klassenmethode:

>>> o.func
<bound method C.func of <__main__.C instance at 0x000000000229ACC8>>

Und wir können den umgekehrten Ansatz ausprobieren. Definieren Sie eine Klasse und stehlen Sie ihre Methode als Funktion:

>>> class A:
...     def func(self):
...         print 'aaa'
...
>>> a = A()
>>> a.func
<bound method A.func of <__main__.A instance at 0x000000000229AD08>>
>>> a.func()
aaa

Bisher sieht es genauso aus. Nun die Funktion Stehlen:

>>> afunc = A.func
>>> afunc(a)
aaa    

Die Wahrheit ist, dass die Methode kein "egal" Argument akzeptiert:

>>> afunc('whatever')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method func() must be called with A instance as first 
  argument (got str instance instead)

IMHO ist dies nicht das Argument gegen Methode ist eine Funktion, die ein Mitglied einer Klasse ist.

Später fand die Alex Martellis Antwort die im Grunde dasselbe sagt. Sorry, wenn Sie es als Duplizierung betrachten :)

2
pepr

http://docs.python.org/2/tutorial/classes.html#method-objects

Normalerweise wird eine Methode direkt nach dem Binden aufgerufen:

x.f()

Im MyClass-Beispiel wird der String 'Hello World' ..__ zurückgegeben. Es ist jedoch nicht notwendig, eine Methode sofort aufzurufen: x.f ist eine Methodenobjekt und kann abgelegt und zu einem späteren Zeitpunkt aufgerufen werden. Zum Beispiel:

xf = x.f
while True:
    print xf()

wird bis zum Ende der Zeit weiterhin hallo Welt drucken.

Was passiert genau, wenn eine Methode aufgerufen wird? Du hast vielleicht bemerkt dass x.f () ohne ein Argument oben aufgerufen wurde, obwohl die Funktionsdefinition für f() hat ein Argument angegeben. Was passierte mit das Argument? Sicherlich löst Python eine Ausnahme aus, wenn eine Funktion die erfordert, dass ein Argument ohne - aufgerufen wird, auch wenn das Argument wird eigentlich nicht benutzt ...

Tatsächlich haben Sie vielleicht die Antwort erraten: das Besondere an Methoden ist, dass das Objekt als erstes Argument von .__ übergeben wird. Funktion. In unserem Beispiel ist der Aufruf x.f () genau äquivalent zu MyClass.f (x). Im Allgemeinen wird eine Methode mit einer Liste von n Argumenten aufgerufen entspricht dem Aufruf der entsprechenden Funktion mit einem Argument Liste, die erstellt wird, indem das Objekt der Methode vor dem ersten .__ eingefügt wird. Streit.

Wenn Sie immer noch nicht verstehen, wie Methoden funktionieren, werfen Sie einen Blick auf. Die Umsetzung kann vielleicht Fragen klären. Wenn ein Instanzattribut referenziert wird, das kein Datenattribut ist, wird seine Klasse durchsucht. Ob Der Name bezeichnet ein gültiges Klassenattribut, das ein Funktionsobjekt ist, eine Das Methodenobjekt wird durch Packen (Zeiger auf) des Instanzobjekts .__ erstellt. und das Funktionsobjekt, das gerade in einem abstrakten Objekt gefunden wurde: Dies ist das Methodenobjekt. Wenn das Methodenobjekt mit einer .__ aufgerufen wird. Argumentliste, eine neue Argumentliste wird aus der Instanz erstellt object und die Argumentliste, und das Funktionsobjekt wird mit .__ aufgerufen. diese neue Argumentliste.

0
acmerfight

Wenn Sie denken, dass ein Objekt einem Nomen ähnlich ist, ähnelt eine Methode einem Verb. Verwenden Sie eine Methode direkt nach einem Objekt (d. H. Eine Zeichenfolge oder Liste), um die Aktion einer Methode darauf anzuwenden.

0
Malik Singleton