Python nos permite redefinir los operadores matemáticos cuando planteamos una clase.
Los métodos especiales que debemos implementar son los siguientes:
Para el operador +:
__add__(self,objeto2)
Para el operador -:
__sub__(self,objeto2)
Para el operador *:
__mul__(self,objeto2)
Para el operador //:
__floordiv__(self,objeto2)
Para el operador /:
__truediv__(self,objeto2)
Veamos con un ejemplo la sintaxis para redefinir el operador +.
Crearemos una clase Cliente de un banco y redefiniremos el operador +
para que nos retorne la suma de los depósitos de los dos clientes que
estamos sumando.
class Cliente:
def __init__(self,nombre,monto):
self.nombre=nombre
self.monto=monto
def __add__(self,objeto2):
s=self.monto+objeto2.monto
return s
cli1=Cliente('Ana',1200)
cli2=Cliente('Luis',1500)
print("El total depositado por los dos clientes es")
print(cli1+cli2)
Definimos el método especial __add__ al que le llega como parámetro además de self un objeto.
El objeto que llega corresponde al que se encuentra luego del operador +, es decir clie2:
print(cli1+cli2)
El algoritmo del método queda codificado como sigue:
def __add__(self,objeto2):
s=self.monto+objeto2.monto
return s
Es muy importante tener en cuenta que debemos redefinir un operador matemático siempre y cuando haga nuestro programa más legible.
Debemos redefinir los operadores +,-,*,/ etc. solo para las clases que con solo leer su nombre el programador intuya que operación implementaría dicho operador.
Desarrollar una clase llamada Lista, que permita pasar al método __init__ una lista de valores enteros.
Redefinir los operadores +,-,* y // con respecto a un valor entero.
class Lista:
def __init__(self, lista):
self.lista=lista
def imprimir(self):
print(self.lista)
def __add__(self,entero):
nueva=[]
for x in range(len(self.lista)):
nueva.append(self.lista[x]+entero)
return nueva
def __sub__(self,entero):
nueva=[]
for x in range(len(self.lista)):
nueva.append(self.lista[x]-entero)
return nueva
def __mul__(self,entero):
nueva=[]
for x in range(len(self.lista)):
nueva.append(self.lista[x]*entero)
return nueva
def __floordiv__(self,entero):
nueva=[]
for x in range(len(self.lista)):
nueva.append(self.lista[x]//entero)
return nueva
# bloque principal
lista1=Lista([3,4,5])
lista1.imprimir()
print(lista1+10)
print(lista1-10)
print(lista1*10)
print(lista1//10)
Al método __init__ llega la lista de enteros:
class Lista:
def __init__(self, lista):
self.lista=lista
Cuando sumamos a la lista un entero llega como parámetro el entero. Dentro del método generamos una nueva lista y la retornamos:
def __add__(self,entero):
nueva=[]
for x in range(len(self.lista)):
nueva.append(self.lista[x]+entero)
return nueva