J'ai ce code qui calcule la distance entre deux coordonnées. Les deux fonctions sont toutes deux dans la même classe.
Cependant, comment 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)
...
Réponses:
Étant donné que ces fonctions sont membres, appeler en fonction de membre de l'instance,
self
.la source
Cela ne fonctionne pas parce que
distToPoint
l'intérieur de votre classe, vous devez le préfixe avec le nom de classe si vous voulez y faire référence, comme ceci:classname.distToPoint(self, p)
. Mais vous ne devriez pas faire comme ça. Une meilleure façon de le faire est de se référer à la méthode directement par l'instance de classe (qui est le premier argument d'une méthode de classe), comme suit:self.distToPoint(p)
.la source
classname.distToPoint(self, p)
: lorsque vous définissez une sous-classe qui remplacedistToPoint
, mais doit appeler l'original. Si vous essayez d'appelerself.distToPoint(p)
comme d'habitude dans ce cas, vous finirez par appeler la méthode que vous venez de définir, et vous entrerez dans une récursion infinie. Si ce n'est pas dans une classe, il n'y a qu'une seule situation où vous utiliseriez à laclassname.distToPoint(obj, p)
place deobj.distToPoint(p)
: si obj pourrait être une instance de la sous-classe, mais vous devez appeler l'originaldistToPoint
défini (suite)classname
au lieu de la version redéfinie dans la sous-classe - mais notez que c'est très hacky et ne devrait pas être fait en général sans une très bonne raison. Notez que vous cassez le polymorphisme de sous-type lorsque vous appelez une méthode explicitement via une classe (dans les deux exemples ci-dessus, vous voulez spécifiquement le faire). Donc, en bref: vous ne devez appeler une méthode explicitement via une classe que lorsque vous devez contourner le polymorphisme de sous-type pour une [bonne] raison. Si la méthode n'a pas été outrepassée, les deux façons sont égales, maisself.distToPoint(p)
sont plus courtes et plus lisibles, (suite)@classmethod
avant la méthode, et après cela, vous n'obtiendrez plus une instance (self
) comme premier argument - à la place, vous obtenez la classe, vous devez donc nommer le premier argument par exemple.cls
au lieu. Après cela, vous pouvez appeler la méthode de classe commeobj.distToPoint(p)
ouclassname.distToPoint(p)
(notez l'absence deobj
). Vous devriez toujours utiliser (suite)obj.distToPoint(p)
, cependant, si vous n'avez qu'une instance pertinente entre les mains, à moins que - encore une fois - vous n'ayez une [bonne] raison de contourner le polymorphisme de sous-type, car la méthode de classe aurait également pu être remplacée dans une sous-classe, en général. Bien sûr, si vous ne disposez pas d'une instance pertinente disponible, vous devez absolument appeler une méthode de classe directement via une classe.