Ich habe diesen Code, der den Abstand zwischen zwei Koordinaten berechnet. Die beiden Funktionen gehören beide zur selben Klasse.
Wie rufe ich die Funktion distToPoint
in der Funktion auf 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)
...
Antworten:
Da es sich um Elementfunktionen handelt, rufen Sie es als Elementfunktion für die Instanz auf
self
.quelle
Das funktioniert nicht, weil
distToPoint
es sich in Ihrer Klasse befindet. Sie müssen ihm also den Klassennamen voranstellen, wenn Sie darauf verweisen möchten, wie folgt :classname.distToPoint(self, p)
. Du solltest es aber nicht so machen. Eine bessere Möglichkeit besteht darin, direkt über die Klasseninstanz (das erste Argument einer Klassenmethode) auf die Methode zu verweisenself.distToPoint(p)
.quelle
classname.distToPoint(self, p)
: Wenn Sie eine Unterklasse definieren, die überschreibtdistToPoint
, aber das Original aufrufen muss. Wenn Sieself.distToPoint(p)
in diesem Fall versuchen würden, wie gewohnt aufzurufen , würden Sie am Ende die Methode aufrufen, die Sie gerade definieren, und in eine unendliche Rekursion geraten. Wenn Sie sich nicht in einer Klasse befinden, gibt es auch nur eine Situation, in der Sieclassname.distToPoint(obj, p)
stattdessen verwenden würdenobj.distToPoint(p)
: Wenn obj eine Instanz der Unterklasse sein könnte, Sie aber das ursprünglichdistToPoint
definierte (Fortsetzung)classname
anstelle der überschriebenen Version in der Unterklasse - aber beachten Sie, dass diese sehr hacky und nicht ohne im Allgemeinen getan werden soll , sehr guten Grund. Beachten Sie, dass Sie den Subtyp-Polymorphismus unterbrechen, wenn Sie eine Methode explizit über eine Klasse aufrufen (in beiden obigen Beispielen möchten Sie dies speziell tun). Kurz gesagt: Sie sollten eine Methode nur dann explizit über eine Klasse aufrufen, wenn Sie aus irgendeinem [guten] Grund den Subtyp-Polymorphismus umgehen müssen . Wenn die Methode nicht überschrieben wurde, sind die beiden Möglichkeiten gleich, aberself.distToPoint(p)
kürzer und besser lesbar (Fortsetzung)@classmethod
vor der Methode hinzufügen. Danach erhalten Sie keine Instanz (self
) mehr als erstes Argument. Stattdessen erhalten Sie die Klasse. Sie sollten also das erste Argument benennen, z.cls
stattdessen. Danach können Sie die Klassenmethode entweder wieobj.distToPoint(p)
oder aufrufenclassname.distToPoint(p)
(beachten Sie das Fehlen vonobj
). Sie sollten immer noch wahrscheinlich verwenden (Fortsetzung)obj.distToPoint(p)
Wenn Sie jedoch nur eine relevante Instanz in Ihren Händen haben, es sei denn, Sie haben erneut einen [guten] Grund, den Subtyp-Polymorphismus zu umgehen, da die Klassenmethode im Allgemeinen auch in einer Unterklasse überschrieben werden könnte. Wenn Sie keine relevante Instanz zur Verfügung haben, sollten Sie eine Klassenmethode auf jeden Fall direkt über eine Klasse aufrufen .