51 - Redefinición de los operadores relacionales con objetos

Python también nos permite redefinir los operadores relacionales cuando planteamos una clase.

Los métodos especiales que podemos implementar son los siguientes:

Para el operador ==:

__eq__(self,objeto2)

Para el operador !=:

__ne__(self,objeto2)

Para el operador >:

__gt__(self,objeto2)

Para el operador >=:

__ge__(self,objeto2)

Para el operador <:

__lt__(self,objeto2)

Para el operador <=:

__le__(self,objeto2)

Es importante recordar que una redefinición de un operador tiene sentido si ayuda y hace más claro nuestro algoritmo.

Problema 1:

Crear una clase Persona que tenga como atributo el nombre y la edad.
El operador == retornará verdadero si las dos personas tienen la misma edad, el operador > retornará True si la edad del objeto de la izquierda tiene una edad mayor a la edad del objeto de la derecha del operador >, y así sucesivamente

Programa: ejercicio210.py

Ver video

class Persona:
    
    def __init__(self,nombre, edad):
        self.nombre=nombre
        self.edad=edad
        
    def __eq__(self,objeto2):
        if self.edad==objeto2.edad:
            return True
        else:
            return False
        
    def __ne__(self,objeto2):
        if self.edad!=objeto2.edad:
            return True
        else:
            return False

    def __gt__(self,objeto2):
        if self.edad>objeto2.edad:
            return True
        else:
            return False

    def __ge__(self,objeto2):
        if self.edad>=objeto2.edad:
            return True
        else:
            return False

    def __lt__(self,objeto2):
        if self.edad<objeto2.edad:
            return True
        else:
            return False

    def __le__(self,objeto2):
        if self.edad<=objeto2.edad:
            return True
        else:
            return False

# bloque principal

persona1=Persona('juan',22)
persona2=Persona('ana',22)
if persona1==persona2:
    print("Las dos personas tienen la misma edad.")
else:
    print("No tienen la misma edad.")

Como podemos observar planteamos un método por cada operador relacional:

    def __eq__(self,objeto2):
        if self.edad==objeto2.edad:
            return True
        else:
            return False

El método recibe como referencia (self) que es la dirección del objeto ubicado a la izquierda del operador relacionar y como parámetro (objeto2) la referencia del objeto ubicado a la derecha del operador. Solo nos queda analizar el atributo edad de cada objeto y retornar True si los dos almacenan el mismo valor, en caso contrario retornamos False.

Problema 2:

Plantear una clase Rectangulo. Definir dos atributos (ladomenor y ladomayor). Redefinir el operador == de tal forma que tengan en cuenta la superficie del rectángulo. Lo mismo hacer con todos los otros operadores relacionales.

Programa: ejercicio211.py

Ver video

class Rectangulo:

    def __init__(self,lmenor,lmayor):
        self.lmenor=lmenor
        self.lmayor=lmayor
        
    def retornar_superficie(self):
        return self.lmenor*self.lmayor
    
    def __eq__(self,objeto2):
        if self.retornar_superficie()==objeto2.retornar_superficie():
            return True
        else:
            return False

    def __ne__(self,objeto2):
        if self.retornar_superficie()!=objeto2.retornar_superficie():
            return True
        else:
            return False

    def __gt__(self,objeto2):
        if self.retornar_superficie()>objeto2.retornar_superficie():
            return True
        else:
            return False

    def __ge__(self,objeto2):
        if self.retornar_superficie()>=objeto2.retornar_superficie():
            return True
        else:
            return False

    def __lt__(self,objeto2):
        if self.retornar_superficie()<objeto2.retornar_superficie():
            return True
        else:
            return False

    def __le__(self,objeto2):
        if self.retornar_superficie()<=objeto2.retornar_superficie():
            return True
        else:
            return False
        

# bloque principal

rectangulo1=Rectangulo(10,10)
rectangulo2=Rectangulo(5,20)
if rectangulo1==rectangulo2:
    print("Los rectangulos tienen la misma superficie")
else:
    print("Los rectangulos no tienen la misma superficie")

Similar al concepto anterior redefinimos los métodos especiales e implementamos un algoritmo para verificar las superficies de dos objetos rectángulos (llamamos al método retornar_superficie de cada objeto):

    def __eq__(self,objeto2):
        if self.retornar_superficie()==objeto2.retornar_superficie():
            return True
        else:
            return False