class Inner():
def __init__(self, x):
self.x = x
def __eq__(self, other):
if isinstance(other, Inner):
return self.x == other.x
else:
raise TypeError("Incorrect type to compare")
class Outer():
def __init__(self, y):
self.y = Inner(y)
def __eq__(self, other):
if isinstance(other, Outer):
return self.y == other.y
elif isinstance(other, Inner):
return self.y == other
else:
raise TypeError("Incorrect type to compare")
if __name__ == "__main__":
a = Outer(1)
b = Inner(1)
print(a == b) # ok no problem
print(b == a) # This will raise a type error
Nell'esempio ho classe interna ed esterna. Non ho il controllo su ciò che gli strumenti interni volevano semplicemente simulare la situazione. Ho solo il controllo sul comportamento di Outer. Voglio che le istanze esterne possano essere confrontate con le istanze interne (non solo l'uguaglianza). Con l'implementazione data funziona solo il primo confronto perché chiama il metodo __eq__
di Outer consentito per essere confrontato con le istanze Outer e Inner ma il secondo sta chiamando Inner's __eq__
che non consente il confronto con Outer - diamine che non lo so Esterno esiste perché dovrebbe preoccuparsi di implementarlo. C'è un modo per far funzionare il secondo tipo di confronto, con qualcosa di simile allo __radd__
e tali funzioni. Lo so per esempio in C++ risolvilo con definizioni di operatori in linea, ma non ne abbiamo in Python.Operatore di confronto 'inverso' in Python