Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimana untuk Mencapai Kesetaraan dalam Kelas Python: Penyelaman Mendalam ke dalam __eq__, __ne__, dan Hashing?
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.
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)
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.
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!