Tengo este código que calcula la distancia entre dos coordenadas. Las dos funciones están dentro de la misma clase.
Sin embargo, ¿cómo llamo a la función distToPoint
en la función 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)
...
Respuestas:
Puesto que éstas son funciones miembro, llamar como una función miembro en la instancia,
self
.fuente
Que no funciona porque
distToPoint
está dentro de su clase, por lo que necesita el prefijo con el nombre de clase, si se desea hacer referencia a ella, como esto:classname.distToPoint(self, p)
. Sin embargo, no deberías hacerlo así. Una mejor manera de hacerlo es hacer referencia al método directamente a través de la instancia de clase (que es el primer argumento de un método de clase), así:self.distToPoint(p)
.fuente
classname.distToPoint(self, p)
: cuando está definiendo una subclase que anuladistToPoint
, pero necesita llamar al original. Si trataste de llamarself.distToPoint(p)
como normal en ese caso, terminarías llamando al método que estás definiendo y entrarías en una recursión infinita. Si no está dentro de una clase, solo hay una situación en la que usaría enclassname.distToPoint(obj, p)
lugar deobj.distToPoint(p)
: si obj podría ser una instancia de la subclase, pero debe llamar al originaldistToPoint
definido (continuación)classname
lugar de la versión anulada en la subclase, pero tenga en cuenta que esto es muy hacky y no debe hacerse en general sin una muy buena razón. Tenga en cuenta que rompe el polimorfismo de subtipo cuando llama a un método explícitamente a través de una clase (en los dos ejemplos anteriores, específicamente desea hacer eso). En resumen: solo debe llamar a un método explícitamente a través de una clase cuando necesita sortear el polimorfismo de subtipo por alguna [buena] razón. Si el método no se ha anulado, las dos formas son iguales, peroself.distToPoint(p)
es más corto y más legible, (continuación)@classmethod
antes del método, y después de eso ya no obtendrás una instancia (self
) como primer argumento; en cambio, obtienes la clase, por lo que debes nombrar el primer argumento, por ejemplo.cls
en lugar. Después de eso, puede llamar al método de clase como likeobj.distToPoint(p)
oclassname.distToPoint(p)
(tenga en cuenta la falta deobj
). Probablemente aún deberías usar (continuación)obj.distToPoint(p)
Sin embargo, si solo tiene una instancia relevante en sus manos, a menos que, nuevamente, tenga alguna [buena] razón para eludir el polimorfismo de subtipo, ya que el método de clase también podría haberse anulado en una subclase, en general. Por supuesto, si no tiene una instancia relevante disponible, debería llamar a un método de clase directamente a través de una clase.