Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Mengendalikan Petua Jenis dengan Baik untuk Kelas Terlampir dalam Python?

Bagaimanakah Saya Boleh Mengendalikan Petua Jenis dengan Baik untuk Kelas Terlampir dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-12-18 00:35:11381semak imbas

How Can I Properly Handle Type Hints for Enclosed Classes in Python?

Petua Jenis Pengendalian untuk Kelas Terlampir dalam Python

Memahami Isu

Apabila mentakrifkan kaedah yang merujuk kepada lampiran kelas sebagai jenis pulangannya, anda mungkin menghadapi ralat rujukan yang tidak dapat diselesaikan. Mari kita pertimbangkan kod berikut dalam Python 3:

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)

Kod ini gagal dengan NameError kerana kelas Position tidak ditakrifkan dalam skop kaedah __add__.

Menyelesaikan Isu

Python 3.11 dengan Jenis 'Self':

Dalam Python 3.11 dan versi yang lebih baru, anda boleh menggunakan jenis Self untuk merujuk kelas yang disertakan dalam pembayang jenis:

from typing import Self

class Position:

    def __add__(self, other: Self) -> Self:
        return Position(self.x + other.x, self.y + other.y)

Python 3.7 dengan '__future__ import anotasi':

Jika anda menggunakan Python 3.7 atau lebih baharu, anda boleh mendayakan penilaian anotasi yang ditangguhkan dengan menambahkan pernyataan import berikut:

from __future__ import annotations

Dengan ini didayakan, pembayang jenis akan disimpan sebagai rentetan sehingga modul dimuatkan sepenuhnya, menyelesaikan rujukan isu:

class Position:

    def __add__(self, other: Position) -> Position:
        return Position(self.x + other.x, self.y + other.y)

Python <3.7:

Untuk versi Python di bawah 3.7, anda boleh menentukan rujukan rentetan kepada kelas yang disertakan menggunakan petikan tunggal:

class Position:

    def __add__(self, other: 'Position') -> 'Position':
        return Position(self.x + other.x, self.y + other.y)

Ini mencipta rujukan hadapan yang akan diselesaikan sebaik sahaja kelas ditentukan.

Tambahan Nota:

  • Jika menggunakan definisi tiruan atau tampalan monyet untuk menambah anotasi, pastikan anotasi menggambarkan jenis kelas dengan tepat.
  • Dalam Python 3.10, penilaian yang ditangguhkan bagi anotasi dijadualkan menjadi lalai, tetapi sejak itu telah ditangguhkan ke masa hadapan lepaskan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengendalikan Petua Jenis dengan Baik untuk Kelas Terlampir dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn