Necesito escribir una clase que permita que una subclase establezca un atributo con el nombre de una función. Esa función debe poder llamarse desde instancias de la clase.¿Escribir una clase que acepte una devolución de llamada en Python?
Por ejemplo, digo que necesito escribir una clase de frutas donde la subclase puede pasar en un mensaje de bienvenida. La clase Fruit debe exponer un atributo print_callback que se puede establecer.
class Fruit(object):
print_callback = None
def __init__(self, *args, **kwargs):
super(Fruit, self).__init__(*args, **kwargs)
self.print_callback("Message from Fruit: ")
necesito para exponer una API que se puede ser consumido por el código (para ser claros, este código no puede cambiar, dicen que es el código de 3 ª parte):
def apple_print(f):
print "%sI am an Apple!" % f
class Apple(Fruit):
print_callback = apple_print
Si me quedo:
mac = Apple()
quiero llegar:
Message from Fruit: I am an Apple!
En vez me sale:
TypeError: apple_print() takes exactly 1 argument (2 given)
Creo que esto se debe a que uno mismo se pasa como primer argumento.
Entonces, ¿cómo escribo la clase Fruit? ¡Gracias!
aprecio los problemas que ha tenido con este enfoque y las excelentes soluciones a continuación. Sin embargo, esto me parece que debería definir 'print_callback' como un método (tal vez simplemente llamado' print_me', y obtener subclases para anularlo.Eso sería simple y pitónico. Para cada tipo diferente de método 'print_me', crea una subclase diferente. –
Mi motivación para plantear la pregunta fue que quería subclasificar google.appengine.ext.db.djangoforms de Google App Engine (por ejemplo, como DF2) para permitir la anulación de un atributo formfield_callback de la misma manera que ModelForm de Django (django.forms.ModelForm) La idea es que la 'clase f (DF2)' podría ser utilizada por el estándar Django simplemente cambiando la superclase a django.forms.ModelForm. No sé por qué los autores de Django definieron formfield_callback como un atributo. –