Maison > développement back-end > Tutoriel Python > Comment puis-je saisir une méthode en utilisant le type de classe englobante en Python ?

Comment puis-je saisir une méthode en utilisant le type de classe englobante en Python ?

Linda Hamilton
Libérer: 2024-12-18 02:26:09
original
280 Les gens l'ont consulté

How Can I Type Hint a Method Using the Enclosing Class Type in Python?

Type indiquant une méthode avec le type de classe englobant

En Python, il est possible de taper des méthodes d'indication pour spécifier les types attendus de leurs arguments et renvoyer des valeurs. Cependant, lorsque vous utilisez des méthodes qui font référence au type de classe englobant, vous pouvez rencontrer des ambiguïtés en raison de la nature dynamique de Python.

Le problème avec les références avancées

Considérez le extrait de code suivant :

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)
Copier après la connexion
Copier après la connexion

Ici, la méthode __add__ attend une autre instance de Position comme argument et renvoie une Position exemple. Cependant, Python n'autorise pas les références directes dans les indications de type, donc l'utilisation du nom de classe Position directement dans les annotations entraînera une erreur.

Utilisation de « Self » pour les références directes (Python 3.11)

Avec l'introduction du PEP 673 dans Python 3.11, le type Self est disponible depuis le module de saisie. L'utilisation de Self permet de transmettre des références au type de classe englobant :

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)
Copier après la connexion

Utilisation de 'from futur importer des annotations' (Python 3.7)

Dans Python 3.7 et versions ultérieures, l'instruction future des annotations from __future__ import permet une évaluation différée de annotations. Cela signifie que les annotations de type seront stockées sous forme de chaînes et évaluées ultérieurement lorsque le module sera complètement chargé :

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)
Copier après la connexion

Utilisation de chaînes pour les références directes (versions Python antérieures à 3.7)

Avant Python 3.7, l'utilisation de chaînes au lieu de noms de classe était l'approche recommandée pour le transfert références :

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)
Copier après la connexion
Copier après la connexion

Cela fonctionnera tant que la définition de classe est trouvée avant que ces indices de type ne soient rencontrés. Cependant, il est important de noter que l'utilisation de chaînes pour l'indication de type peut ne pas être prise en charge par tous les éditeurs de code ou outils d'analyse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal