Python 2.x memiliki dua cara untuk membebani operator perbandingan, __cmp__
atau "operator perbandingan kaya" seperti __lt__
. Perbandingan yang kaya kelebihan dikatakan lebih disukai, tetapi mengapa demikian?
Operator perbandingan kaya lebih sederhana untuk menerapkan masing-masing, tetapi Anda harus mengimplementasikan beberapa di antaranya dengan logika yang hampir identik. Namun, jika Anda dapat menggunakan cmp
pengurutan builtin dan tuple, maka __cmp__
cukup sederhana dan memenuhi semua perbandingan:
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
Kesederhanaan ini tampaknya memenuhi kebutuhan saya jauh lebih baik daripada membebani semua 6 (!) Dari perbandingan yang kaya. (Namun, Anda dapat menurunkannya menjadi "hanya" 4 jika Anda mengandalkan "argumen yang ditukar" / perilaku yang tercermin, tetapi itu menghasilkan peningkatan bersih komplikasi, menurut pendapat saya.)
Apakah ada jebakan tak terduga yang perlu saya waspadai jika saya hanya kelebihan beban __cmp__
?
Saya memahami <
, <=
,==
, dll operator dapat kelebihan beban untuk tujuan lain, dan dapat kembali setiap objek yang mereka suka. Saya tidak bertanya tentang manfaat pendekatan itu, tetapi hanya tentang perbedaan ketika menggunakan operator ini untuk perbandingan dalam arti yang sama yang mereka maksudkan untuk angka.
Pembaruan: Seperti yang ditunjukkan Christopher , cmp
menghilang di 3.x. Apakah ada alternatif lain yang membuat perbandingan penerapan semudah di atas __cmp__
?