403 votes

Comment appeler une fonction dans une classe ?

J'ai ce code qui calcule la distance entre deux coordonnées. Les deux fonctions se trouvent dans la même classe.

Cependant, comment puis-je appeler la fonction distToPoint dans la fonction isNear ?

class Coordinates:
    def distToPoint(self, p):
        """
        Use pythagoras to find distance
        (a^2 = b^2 + c^2)
        """
        ...

    def isNear(self, p):
        distToPoint(self, p)
        ...

46 votes

Essai : self.distToPoint(p)

630voto

Jeff Mercado Points 42075

Puisque ce sont des fonctions membres, appelez-la comme une fonction membre sur l'instance, self .

def isNear(self, p):
    self.distToPoint(p)
    ...

3 votes

Mais attention, self.foo() utilisera l'ordre de résolution des méthodes, ce qui pourrait conduire à une fonction dans une classe différente.

3 votes

Que se passe-t-il si nous n'utilisons pas self ? et que nous appelons directement distToPoint(p) ?

10 votes

@Marlon Abeykoon l'argument du "soi" sera absent.

82voto

Aleksi Torhamo Points 1938

Cela ne fonctionne pas parce que distToPoint est à l'intérieur de votre classe, vous devez donc le préfixer avec le nom de la classe si vous voulez y faire référence, comme ceci : classname.distToPoint(self, p) . Mais il ne faut pas le faire comme ça. Une meilleure façon de procéder est de faire référence à la méthode directement par le biais de l'instance de classe (qui est le premier argument d'une méthode de classe), comme ceci : self.distToPoint(p) .

0 votes

@Aleski. S'il s'agit d'une méthode générique (commune à toutes les instances et sans variables spécifiques d'instance référencées dans la méthode), pourriez-vous expliquer pourquoi on ne devrait pas utiliser classname.distToPoint(self, p) ?

4 votes

@Yugmorf : Il n'y a qu'une seule situation où l'on devrait utiliser classname.distToPoint(self, p) : lorsque vous définissez une sous-classe qui surpasse distToPoint mais doit appeler l'original. Si vous avez essayé d'appeler self.distToPoint(p) comme d'habitude dans ce cas, vous finirez par appeler la méthode que vous venez de définir, et vous vous retrouverez dans une récursion infinie. Si ce n'est pas à l'intérieur d'une classe, il n'y a également qu'une seule situation où vous utiliseriez classname.distToPoint(obj, p) au lieu de obj.distToPoint(p) si obj est une instance de la sous-classe, mais que vous avez besoin d'appeler la classe originale distToPoint défini (suite)

1 votes

Sur classname au lieu de la version surchargée dans la sous-classe - mais notez que c'est très compliqué et qu'il ne faut pas le faire en général sans un fichier très bonne raison. Notez que vous brisez le polymorphisme de sous-type lorsque vous appelez une méthode explicitement à travers une classe (dans les deux exemples ci-dessus, vous avez spécifiquement veulent pour le faire). En résumé, vous ne devez appeler une méthode explicitement par le biais d'une classe que lorsque vous besoin de pour contourner le polymorphisme de sous-type pour une [bonne] raison. Si la méthode n'a pas été surchargée, les deux façons sont égales, mais self.distToPoint(p) est plus court et plus facile à lire, (suite)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X