Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Yidu en 9 Enero 2017, 19:26 pm



Título: ¿Sobrecargar las funciones standard o crear nuestros propios metodos? [PYTHON]
Publicado por: Yidu en 9 Enero 2017, 19:26 pm
Hola!

Profundizando mas en el tema de las clases, intento conocer un poco mas los operadores y metodos que seran utiles usando la sobrecarga.

La sobrecarga de operadores esta mas o menos clara:

Código
  1. class Persona:
  2.    def __init__(self, nombre, edad):
  3.        self.nombre = nombre
  4.        self.edad = edad
  5.        self.inventario = '1,2,3,4,5,6,7'.split(',')
  6.  
  7.    # metodos aritmeticos
  8.  
  9.    def __add__(self, other):
  10.        # suma
  11.        return self.edad + other.edad    
  12.  
  13.    def __sub__(self, other):
  14.        # resta
  15.        return self.edad - other.edad
  16.  

Para sobrecargar la funcion standard de python pow(a, b):

Código
  1. def __pow__(self, valor):
  2.        # potenciacion
  3.        return self.edad ** valor

Luego instanciariamos:

Código
  1. p1 = Persona('Juan', 30)
  2. p2 = Persona('Ivan', 20)

Y probariamos las sobrecargas:

Código
  1. print(p1 + p2) # 50 (__add__)
  2. print(p1 - p2) # 10 (__sub__)
  3. print(p1 ** 2) # 900 (__pow__)

¿Pero como se sobrecargaria, por ejemplo, la funcion standard len()? Seria para comprobar el numero de elementos del atributo self.inventario. Creo que asi seria erroneo:

Código
  1. def __len__(self):
  2.        return len(self.inventario)

Aunque funcionar, funciona...

Código
  1. print(len(p1)) # 7

La duda es si sobrecargar funciones standard de Python consiste en meter la misma funcion dentro del metodo sobrecargado. Es que visto asi, suena a redundancia ¿No?

Por que cuando queremos utilizar la salida de print mediante la sobrecarga hacemos:

Código
  1. def __str__(self):
  2.        # se ejecuta mediante print()
  3.        return 'Nombre: {}'.format(self.nombre)

No esto:

Código
  1. def __print__(self):
  2.        # se ejecuta mediante print()
  3.        return 'Nombre: {}'.format(self.nombre)

Resumiendo, ¿Es mejor crear nuestros propios metodos y meter dentro de ellos las funciones standard?

Saludos!  :)


Título: Re: ¿Sobrecargar las funciones standard o crear nuestros propios metodos? [PYTHON]
Publicado por: Eleкtro en 15 Enero 2017, 09:19 am
Hola.

No me considero el más cualificado para aconsejar sobre directrices de diseño en el lenguaje Python, más que nada por lo restrictivo (dogmático, odioso, pesado, cansino, feo) que me resulta, y la cantidad de cosas que ignoro a nivel avanzado sobre dicho lenguaje, sin embargo, desde un punto de vista objetivo con un enfoque global hacia los lenguajes de programación en si, yo te diría que implementases sobrecargas siempre que se diesen las circunstancias óptimas para hacerlo (por ejemplo si defines un método con la misma firma y propósito que un método built-in pero que toma un parámetro adicional), puesto que de esta manera estarías simplificando el modo de empleo de tu código, un gran beneficio productivo de cara a ti y al usuario final.

Si por ejemplo defines dos métodos con el mismo propósito de por ejemplo escribir un valor del mismo type en un archivo local, y los dos métodos tienen practicamente la misma firma/parametización pero con leves diferencias, entonces resultaría innecesario llamarlos por nombres distintos, uno debería ser la sobrecarga.

Un saludo!.


Título: Re: ¿Sobrecargar las funciones standard o crear nuestros propios metodos? [PYTHON]
Publicado por: Yidu en 15 Enero 2017, 18:31 pm
Gracias por el consejo. Yo pienso mas o menos parecido.

Aunque todavia no domino el tema de las clases en Python, soy mas partidario de usar las funciones standard y que ellas operen con los objetos. Esta claro, que para programadores avanzados, quizas las builtins se le quedaran cortas. Pero no es mi caso. Dudo que haya mucha gente que domine Python al cien por cien. Al poder utilizar tres paradigmas distintos de programacion, a veces dificil cual de ellos escoger para nuestros scripts.

Un saludo!