¿Debería usar una clase? (Pitón)

Estoy tratando de escribir un pequeño módulo de Python que contenga algunas funciones matemáticas. Por ejemplo, podría contener una función como:

def quad(x, a, b, c):
    return a*x**2 + b*x + c

Como puede notar, contiene varios parámetros (a saber. a, b, c) aparte de la variable x. Ahora bien, si tuviera que poner esto en un archivo y simplemente importarlo, el usuario final siempre tendría que llamar a la función con los parámetros además de la variable. Debido a esto, estaba pensando en crear una clase como esta:

class quad:                                    
    def __init__(self, a, b, c):               
        self.a = a                             
        self.b = b                             
        self.c = c                             

    def eq(x):                               
        return self.a*x**2 + self.b*x + self.c 

Permitiendo así que el usuario final lo utilice como:

q = quad(p, q, r) 
eq = q.eq      

¿Es esta la forma correcta de hacer las cosas? Lamento mucho el título de la pregunta, ¡ya que no podría pensar en una mejor!

preguntado el 31 de enero de 12 a las 08:01

2 Respuestas

Parece un uso perfectamente razonable de una clase. Esencialmente, debería considerar el uso de una clase cuando su programa involucre cosas que se pueden modelar como objetos con estado. Aquí, el "estado" de su polinomio son solo los coeficientes a, by c.

También puedes usar Python __call__ método especial para permitirle tratar la clase como si fuera una función en sí misma:

class quad:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def __call__(x):
        return self.a * x**2 + self.b * x + self.c

q = quad(p, q, r)
q(x)

Sin embargo, otra forma de hacerlo, que podría ser un poco más limpia, sería simplemente devolver una función con esos coeficientes incorporados. Este es esencialmente un ejemplo de curry, como menciona Tichodrama:

def quad(a, b, c):
    def __quad(x):
        return a * x**2 + b * x + c

    return __quad

O usando lambda sintaxis:

def quad(a, b, c):
    return lambda x: a * x**2 + b * x + c

Estos podrían usarse así:

q = quad(p, q, r)
q(x)

Respondido el 31 de enero de 12 a las 12:01

+1 ¡Gracias! Creo que seguiré con el ejemplo de devolución de una función, ya que las definiciones de mi función son demasiado complicadas para ser manejadas por la sintaxis lambda. - pewfly

Parece que estás buscando algo como zurra.

Quizás esta pregunta puedo ayudarte.

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.