reticulada - python regius
funciones de fábrica de pitón en comparación con la clase (3)
Simplemente trabajando a través del aprendizaje de Python y comencé a observar las funciones anidadas / de fábrica (ejemplo simple):
def maker(N):
def action(X):
return X * N
return action
¿Hay alguna ventaja de las funciones de fábrica sobre la creación de una clase? ¿actuación? ¿memoria? ¿limpiar?
Las funciones de anidamiento le permiten a uno crear funciones personalizadas sobre la marcha.
Eche un vistazo, por ejemplo, a los decoradores . Las funciones resultantes dependen de variables que están vinculadas en el momento de la creación y no necesitan ser cambiadas después. Entonces, usar una clase para este propósito tendría menos sentido.
Lo que más me gusta de las funciones anidadas es que es menos detallado que las clases. La definición de clase equivalente a su función de creador es:
class clsmaker(object):
def __init__(self, N):
self.N = N
def __call__(self, X):
return X * self.N
Eso no parece tan malo hasta que comiences a agregar más argumentos al constructor. Luego hacerlo de la forma de clase toma una línea adicional para cada argumento, mientras que la función simplemente obtiene los argumentos adicionales.
Resulta que también hay una ventaja de velocidad para las funciones anidadas:
>>> T1 = timeit.Timer(''maker(3)(4)'', ''from __main__ import maker'')
>>> T1.timeit()
1.2818338871002197
>>> T2 = timeit.Timer(''clsmaker(3)(4)'', ''from __main__ import clsmaker'')
>>> T2.timeit()
2.2137160301208496
Esto puede deberse a que hay menos códigos de operación involucrados en la versión de funciones anidadas:
>>> dis(clsmaker.__call__)
5 0 LOAD_FAST 1 (X)
3 LOAD_FAST 0 (self)
6 LOAD_ATTR 0 (N)
9 BINARY_MULTIPLY
10 RETURN_VALUE
>>> act = maker(3)
>>> dis(act)
3 0 LOAD_FAST 0 (X)
3 LOAD_DEREF 0 (N)
6 BINARY_MULTIPLY
7 RETURN_VALUE
Comparar una fábrica de funciones con una clase es comparar manzanas y naranjas. Use una clase si tiene una colección cohesiva de datos y funciones, a la que se denomina un objeto. Use una fábrica de funciones si necesita una función y desea parametrizar su creación.
Su elección de las dos técnicas debería depender del significado del código.