Debe haber una manera fácil de hacer esto, pero de alguna manera puedo entenderlo. La mejor forma en que puedo describir lo que quiero es una función lambda para una clase. Tengo una biblioteca que espera como argumento una versión desinstalada de una clase para trabajar. A continuación, ejemplifica la clase en sí para trabajar. El problema es que me gustaría poder crear versiones dinámicas de la clase, pasarlas a la biblioteca, pero no puedo entender cómo hacerlo, ya que la biblioteca espera una versión desinstalada. El código siguiente describe el problema:Función lambda para clases en python?
class Double:
def run(self,x):
return x*2
class Triple:
def run(self,x):
return x*3
class Multiply:
def __init__(self,mult):
self.mult = mult
def run(self,x):
return x*self.mult
class Library:
def __init__(self,c):
self.c = c()
def Op(self,val):
return self.c.run(val)
op1 = Double
op2 = Triple
#op3 = Multiply(5)
lib1 = Library(op1)
lib2 = Library(op2)
#lib3 = Library(op3)
print lib1.Op(2)
print lib2.Op(2)
#print lib3.Op(2)
no puedo usar la clase genérica Multiplicar, porque debo instanciarlo primero que rompe la biblioteca "AttributeError: Multiplicar instancia no tiene llamada método". Sin cambiar la clase de la Biblioteca, ¿hay alguna forma de que pueda hacer esto?
La ventaja de usar un convertidor general, por supuesto, es que aceptaría en principio, cualquier función de un solo arg, liberando implementaciones adicionales de la necesidad de definir explícitamente sus clases –
me gusta la función createMultiplier(). Elegante. – Deestan
Sé que esta es una publicación anterior, pero aquí hay algo que vale la pena señalar. createMultiplier (4)! = createMultiplier (4). Esto se debe a que la clase se crea dos veces en dos ubicaciones de memoria diferentes.A menos que Multiply tenga una metaclase que anule el comportamiento predeterminado para comparar clases, debe crear un diccionario simple para almacenar en caché los objetos de clase producidos. El dict estaría codificado por n, y los valores serían las clases. Pero esto puede no ser eficiente desde el punto de vista de la memoria si se crean un grupo de clases pero no se utilizan. La forma más sencilla aquí es adjuntar un atributo de clase a Multiplicar. P.ej. Multiplicar.x = 5. –