Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
¿Sobrecarga de operadores que lo hacen por defecto?
#1
Hola de nuevo!  Smile

Echando un vistazo a la sobrecarga de operadores me surge una duda. Recientemente he instalado python 3.7 y no se tiene algo que ver con esta version. Por ejemplo, si sobrecargo un metodo magico relacional asi:

Código:
class Animal:
   def __init__(self, peso):
       self.peso = peso
       
   # Menor que...
   def __lt__(self, other):      
       return self.peso < other.peso
   
   # Menor o igual que...
   def __le__(self, other):        
       return self.peso <= other.peso
   
 



elefante = Animal(1000)
leon = Animal(300)

print(elefante < leon)
print(elefante > leon)
print(elefante == leon)
print(elefante != leon)
print(elefante <= leon)
print(elefante >= leon)

Me da como resultado:
Código:
False
True
False
True
False
True
Pero claro, yo los otros metodos relacionales en la clase no los he definido. 
Incluso si dejo sin definir el metodo __le__ me da una excepcion. Por lo que aun me asaltan mas dudas de como opera todo esto:
Código:
class Animal:
   def __init__(self, peso):
       self.peso = peso
       
   # Menor que...
   def __lt__(self, other):      
       return self.peso < other.peso
   '''
   # Menor o igual que...
   def __le__(self, other):        
       return self.peso <= other.peso
   '''
   
 



elefante = Animal(1000)
leon = Animal(300)

print(elefante < leon)
print(elefante > leon)
print(elefante == leon)
print(elefante != leon)
print(elefante <= leon)
print(elefante >= leon)

Me salta la excepcion:
Código:
False
True
False
True
Traceback (most recent call last):
 File "relacionales.py", line 27, in <module>
   print(elefante <= leon)
TypeError: '<=' not supported between instances of 'Animal' and 'Animal'
 Cosa que veo normal al no definir el metodo __le__
Pero claro, tampoco he definido los otros metodos relacionales y en cambio python he realizado las operaciones de True y False.
La duda que tengo es si se deben definir todos los metodos de relacionales. Porque en el primer ejemplo que puse, con solo definir un par, no da ningun error.
Gracias!
Responder
#2
Hola. Los operadores de igualdad (==) y desigualdad (!=) por defecto tienen un comportamiento que chequea si los dos objetos de la comparación son el mismo (es decir, lo mismo que los operadores is e is not). Podés comprobar creando dos objetos distintos pero con el mismo atributo:

  1. elefante = Animal(1000)
  2. leon = Animal(1000)
  3. print(elefante == leon) # False


Lo más común es que también quieras chequear ese atributo para las operaciones de igualdad y desigualdad:

  1. def __eq__(self, other):
  2. return self.peso == other.peso


Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)