Stosowanie isinstance w __eq__
jest dość powszechne. Powodem tego jest to, że jeśli metoda __eq__
ulegnie awarii, może ona zastąpić metodę __eq__
z innego obiektu. Większość normalnych metod jest wywoływana jawnie, ale __eq__
jest nazywana niejawnie, więc wymaga częściej niż wcześniej.
EDIT (dzięki za przypomnienie, Sven Marnach):
Żeby było awaryjne, można zwrócić NotImplemented Singleton, jak w poniższym przykładzie:
class Trout(object):
def __init__(self, value):
self.value = value
def __eq__(self, other):
if isinstance(other, Trout):
return self.value == other.value
else:
return NotImplemented
Załóżmy, że RainbowTrout
umie porównać się do Trout
lub do innego RainbowTrout
, ale tylko Trout
tylko wie, jak porównać się z Trout
. W tym przykładzie, jeśli przetestujesz mytrout == myrainbowtrout
, Python najpierw zadzwoni pod numer mytrout.__eq__(myrainbowtrout)
, zwróci uwagę, że się nie powiedzie, a następnie zadzwoni pod numer myrainbowtrout.__eq__(mytrout)
, który się powiedzie.
Myślę, że jest to uzasadniony przypadek użycia dla 'isinstance'. –