Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mencapai Kesetaraan dalam Kelas Python: Penyelaman Mendalam ke dalam __eq__, __ne__, dan Hashing?

Bagaimana untuk Mencapai Kesetaraan dalam Kelas Python: Penyelaman Mendalam ke dalam __eq__, __ne__, dan Hashing?

Linda Hamilton
Linda Hamiltonasal
2024-11-08 08:12:02376semak imbas

How to Achieve Equivalence in Python Classes: A Deep Dive into __eq__, __ne__, and Hashing?

Melaksanakan Kesetaraan dalam Kelas Python dengan Keanggunan

Dalam Python, kelas tersuai boleh dilengkapi dengan kesetaraan melalui pelaksanaan kaedah khas eq dan ne untuk operator == dan !=, masing-masing. Ini membolehkan objek daripada kelas tersebut dibandingkan untuk kesamaan berdasarkan atributnya.

Pelaksanaan Asas

Kaedah yang mudah tetapi berkesan untuk mencapai kesetaraan adalah dengan membandingkan kamus yang mengandungi atribut objek :

class Foo:
    def __init__(self, item):
        self.item = item

    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

    def __ne__(self, other):
        return not self.__eq__(other)

Mengatasi Perangkap

Sementara ini kaedah mewujudkan kesetaraan antara objek kelas yang sama, ia menghadapi cabaran apabila berurusan dengan subkelas atau contoh jenis yang tidak berkaitan. Untuk menangani isu ini, pertimbangan berikut adalah penting:

Ketidakkomutatifan Kelas Gaya Klasik:

Kelas Python 2 gaya klasik melaksanakan eq Kaedah operan pertama manakala ne dipanggil pada operan kedua. Untuk memastikan simetri, pertimbangkan untuk mengembalikan NotImplemented untuk jenis operan yang tidak disokong.

Returning NotImplemented untuk Jenis Non-supported:

Untuk kes di mana operan adalah daripada jenis yang berbeza (tidak warisan), mengembalikan NotImplemented dalam eq dan ne mewakilkan perbandingan kepada kaedah yang dicerminkan bagi operan yang lain. Ini memastikan komutatif dan membenarkan penggunaan set untuk menentukan kejadian unik.

Pencincangan dan Pengendalian Set:

Secara lalai, objek dicincang menggunakan pengecam objeknya. Untuk memastikan perbandingan yang betul dalam set, gantikan cincang untuk mengira cincang yang konsisten berdasarkan atribut objek.

Pelaksanaan yang Lebih Teguh

Menggabungkan pertimbangan ini menghasilkan yang lebih mantap pelaksanaan untuk kesetaraan objek:

class Number:

    def __init__(self, number):
        self.number = number

    def __eq__(self, other):
        if isinstance(other, Number):
            return self.number == other.number
        return NotImplemented

    def __ne__(self, other):
        x = self.__eq__(other)
        if x is not NotImplemented:
            return not x
        return NotImplemented

    def __hash__(self):
        return hash(tuple(sorted(self.__dict__.items())))

Pelaksanaan ini memastikan kesetaraan yang betul dan pencincangan walaupun merentas subkelas dan kejadian yang tidak berkaitan, menyediakan cara yang lebih elegan dan komprehensif untuk menyokong kesetaraan dalam kelas Python.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Kesetaraan dalam Kelas Python: Penyelaman Mendalam ke dalam __eq__, __ne__, dan Hashing?. 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