Wie kann ich eine Funktion innerhalb einer Klasse aufrufen?

Lesezeit: 3 Minuten

Benutzer-Avatar
Stefan

Ich habe diesen Code, der den Abstand zwischen zwei Koordinaten berechnet. Die beiden Funktionen gehören beide zur selben Klasse.

Aber wie rufe ich die Funktion auf distToPoint in der Funktion 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)
        ...

Da es sich um Member-Funktionen handelt, rufen Sie sie als Member-Funktion für die Instanz auf. self.

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

  • Aber seien Sie vorsichtig self.foo() verwendet die Methodenauflösungsreihenfolge, die möglicherweise in eine Funktion in einer anderen Klasse aufgelöst wird.

    – Franz Davey

    17. Januar 2014 um 20:55 Uhr

  • Was passiert, wenn wir uns nicht selbst benutzen? und distToPoint(p) direkt aufrufen?

    – Marlon Abeykoon

    16. August 2016 um 4:30 Uhr

  • @Marlon Abeykoon das Argument “self” wird fehlen

    – Mitleid

    27. November 2016 um 13:10 Uhr

  • Was ist, wenn isNear und distToPoint unterschiedliche Argumente verwenden? Wie können wir dann distToPoint aufrufen, das sich innerhalb der Klasse befindet? Wer kann mir das bitte erklären.

    – Raghavendra Gupta

    7. Februar 2019 um 8:46 Uhr

Benutzer-Avatar
Alexi Torhamo

Das geht nicht, weil distToPoint befindet sich in Ihrer Klasse, also müssen Sie ihm den Klassennamen voranstellen, wenn Sie darauf verweisen möchten, wie folgt: classname.distToPoint(self, p). So sollte man es aber nicht machen. Ein besserer Weg, dies zu tun, besteht darin, direkt über die Klasseninstanz (die das erste Argument einer Klassenmethode ist) auf die Methode zu verweisen, wie folgt: self.distToPoint(p).

  • @ Alesky. Wenn es sich um eine generische Methode handelt (allen Instanzen gemeinsam und ohne instanzspezifische Variablen, auf die in der Methode verwiesen wird), könnten Sie bitte erklären, warum man nicht classname.distToPoint(self, p) verwenden sollte?

    – Yugmorf

    10. Oktober 2018 um 4:04 Uhr

  • @Yugmorf: Es gibt nur eine Situation, in der man verwenden sollte classname.distToPoint(self, p): Wenn Sie eine Unterklasse definieren, die überschreibt distToPoint, muss aber das Original aufrufen. Wenn Sie versucht haben, anzurufen self.distToPoint(p) Wie in diesem Fall üblich, 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 Sie verwenden würden classname.distToPoint(obj, p) Anstatt von obj.distToPoint(p): wenn obj eine Instanz der Unterklasse sein könnte, Sie aber das Original aufrufen müssen distToPoint definiert (Fortsetzung)

    – Aleksi Torhamo

    10. Oktober 2018 um 13:30 Uhr

  • in classname anstelle der überschriebenen Version in der Unterklasse – aber beachten Sie, dass dies sehr hacky ist und im Allgemeinen nicht ohne a gemacht werden sollte sehr guter Grund. Beachten Sie, dass Sie den Subtyp-Polymorphismus brechen, wenn Sie eine Methode explizit über eine Klasse aufrufen (in beiden obigen Beispielen müssen Sie speziell wollen das zu tun). Kurz gesagt: Sie sollten eine Methode nur dann explizit über eine Klasse aufrufen, wenn Sie brauchen um den Subtyp-Polymorphismus für einige zu umgehen [good] Grund. Wenn die Methode nicht überschrieben wurde, sind die beiden Möglichkeiten gleich, aber self.distToPoint(p) ist kürzer und besser lesbar, (Fortsetzung)

    – Aleksi Torhamo

    10. Oktober 2018 um 13:30 Uhr

  • Sie sollten es also unbedingt noch verwenden. Kommen wir nun zu den Einzelheiten Ihrer Frage: Wenn Ihre Methode keine Instanzvariablen verwendet, sollte es vielleicht stattdessen eine Klassenmethode sein? Sie machen diese durch Hinzufügen @classmethod vor der Methode, und danach erhalten Sie keine Instanz (self) nicht mehr als erstes Argument – stattdessen erhalten Sie die Klasse, also sollten Sie das erste Argument z. cls stattdessen. Danach können Sie die Klassenmethode entweder wie aufrufen obj.distToPoint(p) oder classname.distToPoint(p) (beachten Sie das Fehlen von obj). Du solltest still wahrscheinlich verwenden (Fortsetzung)

    – Aleksi Torhamo

    10. Oktober 2018 um 13:31 Uhr


  • obj.distToPoint(p)wenn Sie nur eine relevante Instanz zur Hand haben, es sei denn, Sie haben – wieder – welche [good] Grund, den Subtyp-Polymorphismus zu umgehen, da die Klassenmethode im Allgemeinen auch in einer Unterklasse überschrieben werden könnte. Natürlich, wenn Sie keine haben relevant Instanz verfügbar, sollten Sie unbedingt a aufrufen Klassenmethode direkt über eine Klasse.

    – Aleksi Torhamo

    10. Oktober 2018 um 13:31 Uhr

1093300cookie-checkWie kann ich eine Funktion innerhalb einer Klasse aufrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy