web-dev-qa-db-fra.com

Qu'est-ce qu'une "méthode" en Python?

Quelqu'un peut-il, s'il vous plaît, m'expliquer en termes très simples ce qu'est une "méthode" en Python?

Dans de nombreux tutoriels pour débutants en Python, ce mot est utilisé de manière à ce que le débutant sache déjà ce qu'est une méthode dans le contexte de Python. Bien que je connaisse bien entendu le sens général de cette Parole, je ne sais pas ce que ce terme signifie en Python. Expliquez-moi donc en quoi consiste la méthode "Pythonian".

Un exemple de code très simple serait très apprécié, car une image vaut mille mots.

65
brilliant

C'est une fonction qui est membre d'une classe:

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

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

Aussi simple que cela!

(Il existe également d'autres types de méthodes, vous permettant de contrôler la relation entre la classe et la fonction. Mais d'après votre question, vous devinez bien que vous ne posez pas cette question, mais plutôt les bases.)

75
RichieHindle

Une méthode est une fonction qui prend une instance de classe comme premier paramètre. Les méthodes sont membres de classes.

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

Comme vous vouliez savoir ce que cela signifie spécifiquement en Python, on peut distinguer les méthodes liées des méthodes non liées. En Python, toutes les fonctions (et en tant que telles aussi les méthodes) sont des objets qui peuvent être transmis et "joués avec". Ainsi, la différence entre les méthodes non liées et liées est la suivante:

1) méthodes liées

# 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

Les méthodes liées sont des méthodes qui appartiennent aux instances d'une classe. Dans cet exemple, instance.method est lié à l'instance appelée instance. Chaque fois que cette méthode liée est appelée, l'instance est transmise automatiquement en tant que premier paramètre - appelé self par convention.

2) Méthodes non liées

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

Lorsque vous accédez à C.method (la méthode dans une classe au lieu d'une instance), vous obtenez une méthode non liée. Si vous voulez l'appeler, vous devez passer l'instance en premier paramètre car la méthode est pas liée à une instance.

Sachant cette différence, vous pouvez utiliser des fonctions/méthodes en tant qu’objets, par exemple en transmettant des méthodes. À titre d'exemple, imaginez une API qui vous permet de définir une fonction de rappel, mais vous souhaitez fournir une méthode en tant que fonction de rappel. Pas de problème, il suffit de passer self.myCallbackMethod comme rappel et l'appel sera automatiquement appelé avec l'instance comme premier argument. Cela ne serait pas possible dans des langages statiques comme C++ (ou seulement avec des ruses).

J'espère que vous avez compris;) Je pense que c'est tout ce que vous devez savoir sur les bases de la méthode. Vous pouvez également en savoir plus sur les décorateurs classmethod et staticmethod, mais c'est un autre sujet.

36
AndiDog

En Python, une méthodeest une fonction disponible pour un objet donné en raison du type de l'objet .

Par exemple, si vous créez my_list = [1, 2, 3], la méthode append peut être appliquée à my_list car il s'agit d'une liste Python: my_list.append(4). Toutes les listes ont une méthode append simplement parce qu'elles sont des listes.

Comme autre exemple, si vous créez my_string = 'some lowercase text', la méthode upper peut être appliquée à my_string simplement parce que c'est une chaîne Python: my_string.upper().

Les listes n'ont pas de méthode upper et les chaînes n'ont pas de méthode append. Pourquoi? Parce que les méthodes n'existent que pour un objet particulier si elles ont été définies explicitement pour ce type d'objet , et que les développeurs de Python ont (jusqu'à présent) décidé que ces méthodes n'étaient pas nécessaires pour ces objets particuliers.

Pour appeler une méthode, le format est object_name.method_name() et tous les arguments de la méthode sont répertoriés entre parenthèses. La méthode agit implicitement sur l'objet en train d'être nommé. Par conséquent, certaines méthodes n'ont pas d'argument déclaré puisque l'objet lui-même est le seul argument nécessaire. Par exemple, my_string.upper() ne possède aucun argument répertorié car le seul argument requis est l'objet lui-même, my_string.

Un point de confusion commun concerne les points suivants:

import math
math.sqrt(81)

sqrt est-il une méthode de l'objet math? Non. Voici comment vous appelez la fonction sqrt à partir du module math. Le format utilisé est module_name.function_name() au lieu de object_name.method_name(). En général, la seule façon de distinguer (visuellement) les deux formats est de regarder dans le reste du code et de voir si la partie avant la période (math, my_list, my_string) est définie comme un objet ou un objet. module.

20
Kevin Markham

Désolé, mais - à mon avis - RichieHindle a parfaitement raison de dire cette méthode ...

C'est une fonction qui est membre d'une classe.

Voici l'exemple d'une fonction qui devient le membre de la classe. Depuis lors, il se comporte comme une méthode de la classe. Commençons par la classe vide et la fonction normale avec un argument:

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

Nous ajoutons maintenant un membre à la classe C, qui est la référence à la fonction. Après cela, nous pouvons créer l'instance de la classe et appeler sa méthode comme si elle avait été définie dans la classe:

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

Nous pouvons également utiliser la méthode alternative pour appeler la méthode:

>>> C.func(o)
func called

Le o.func se manifeste même de la même manière que la méthode de classe:

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

Et nous pouvons essayer l'approche inversée. Définissons une classe et volons sa méthode en tant que fonction:

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

Jusqu'ici, ça a l'air pareil. Maintenant la fonction voler:

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

La vérité est que la méthode n'accepte pas l'argument «peu importe»:

>>> 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, ce n'est pas l'argument contre méthode est une fonction qui est membre d'une classe.

Plus tard a trouvé le la réponse d'Alex Martelli qui dit essentiellement la même chose. Désolé si vous envisagez la duplication :)

2
pepr

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

Habituellement, une méthode est appelée juste après qu'elle soit liée:

x.f()

Dans l'exemple MyClass, cela renverra la chaîne 'hello world' . Cependant, il n'est pas nécessaire d'appeler une méthode immédiatement: x.f est un méthode, et peuvent être stockés et appelés ultérieurement. Pour Exemple:

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

continuera à imprimer Bonjour tout le monde jusqu'à la fin des temps.

Qu'est-ce qui se passe exactement quand une méthode est appelée? Vous avez peut-être remarqué que x.f () a été appelé sans l'argument ci-dessus, même si le La définition de fonction pour f() spécifiait un argument. Qu'est-il arrivé à l'argument? Sûrement Python soulève une exception quand une fonction qui nécessite un argument est appelé sans aucun - même si l'argument n'est pas réellement utilisé ...

En fait, vous avez peut-être deviné la réponse: la particularité de method est que l'objet est passé en tant que premier argument du une fonction. Dans notre exemple, l'appel x.f () est exactement équivalent à MyClass.f (x). En général, appeler une méthode avec une liste de n arguments équivaut à appeler la fonction correspondante avec un argument la liste créée en insérant l’objet de la méthode avant le premier argument.

Si vous ne comprenez toujours pas comment fonctionnent les méthodes, jetez un coup d’œil à la mise en œuvre peut peut-être clarifier les choses. Lorsqu'un attribut d'instance référencé qui n’est pas un attribut de données, sa classe est recherchée. Si le nom dénote un attribut de classe valide qui est un objet fonction, un L'objet de méthode est créé en compressant (des pointeurs vers) l'objet d'instance et l'objet fonction qui vient d'être trouvé dans un objet abstrait: c'est l'objet méthode. Lorsque l'objet de méthode est appelé avec un liste d'arguments, une nouvelle liste d'arguments est construite à partir de l'instance object et la liste d'arguments, et l'objet de fonction est appelé avec cette nouvelle liste d'arguments.

0
acmerfight

Si vous pensez qu'un objet ressemble à un nom, alors une méthode s'apparente à un verbe. Utilisez une méthode juste après un objet (c'est-à-dire une chaîne ou une liste) pour lui appliquer l'action d'une méthode.

0
Malik Singleton