Typhinweis einer Methode mit dem einschließenden Klassentyp
In Python ist es möglich, Hinweismethoden einzugeben, um die erwarteten Typen ihrer Argumente anzugeben und Rückgabewerte. Beim Umgang mit Methoden, die auf den umschließenden Klassentyp verweisen, kann es jedoch aufgrund der dynamischen Natur von Python zu Mehrdeutigkeiten kommen.
Das Problem mit Vorwärtsverweisen
Bedenken Sie die Folgender Codeausschnitt:
class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: 'Position') -> 'Position': return Position(self.x + other.x, self.y + other.y)
Hier erwartet die __add__-Methode eine weitere Position-Instanz als Argument und gibt a zurück Instanz positionieren. Allerdings erlaubt Python keine Vorwärtsverweise in Typhinweisen, sodass die Verwendung des Klassennamens Position direkt in Annotationen zu einem Fehler führt.
Verwendung von „Self“ für Vorwärtsverweise (Python 3.11)
Mit der Einführung von PEP 673 in Python 3.11 ist der Self-Typ in der Typisierung verfügbar Modul. Die Verwendung von Self ermöglicht Vorwärtsverweise auf den umschließenden Klassentyp:
from typing import Self class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: Self) -> Self: return Position(self.x + other.x, self.y + other.y)
Using 'from future import annotations' (Python 3.7)
In Python 3.7 und höher ermöglicht die Anweisung from __future__ import annotations future die verschobene Auswertung von Anmerkungen. Dies bedeutet, dass Typanmerkungen als Zeichenfolgen gespeichert und später ausgewertet werden, wenn das Modul vollständig geladen ist:
from __future__ import annotations class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: 'Position') -> 'Position': return Position(self.x + other.x, self.y + other.y)
Verwenden von Zeichenfolgen für Vorwärtsreferenzen (Python-Versionen älter als 3.7)
Vor Python 3.7 war die Verwendung von Zeichenfolgen anstelle von Klassennamen der empfohlene Ansatz für die Weiterleitung Referenzen:
class Position: def __init__(self, x: int, y: int): self.x = x self.y = y def __add__(self, other: 'Position') -> 'Position': return Position(self.x + other.x, self.y + other.y)
Dies funktioniert, solange die Klassendefinition gefunden wird, bevor diese Typhinweise gefunden werden. Es ist jedoch wichtig zu beachten, dass die Verwendung von Zeichenfolgen für Typhinweise möglicherweise nicht von allen Code-Editoren oder Analysetools unterstützt wird.
Das obige ist der detaillierte Inhalt vonWie kann ich eine Methode mithilfe des einschließenden Klassentyps in Python eingeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!