una tipos que propias otra matematicas llamar lista idle funciones funcion dentro definir crea como python design-patterns oop

tipos - que es idle python



Patrón de comando general y patrón de envío de comando en Python (4)

Estaba buscando una implementación de patrón de comando en Python ... (Según Wikipedia ,

El patrón de comando es un patrón de diseño en el que un objeto se utiliza para representar y encapsular toda la información necesaria para llamar a un método en un momento posterior.

)

Lo único que encontré fue el pattern envío de comandos:

class Dispatcher: def do_get(self): ... def do_put(self): ... def error(self): ... def dispatch(self, command): mname = ''do_'' + command if hasattr(self, mname): method = getattr(self, mname) method() else: self.error()

Puede que me equivoque, pero parece que estos son dos conceptos diferentes, que accidentalmente tienen nombres similares.

¿Me estoy perdiendo de algo?


El patrón de comando más simple ya está integrado en Python, simplemente use un llamable:

def greet(who): print "Hello %s" % who greet_command = lambda: greet("World") # pass the callable around, and invoke it later greet_command()

El patrón de comando como un patrón de diseño orientado a objetos tiene más sentido si sus comandos necesitan poder hacer más que solo ser invocado. El caso de uso común es cuando necesita poder deshacer / rehacer sus acciones. Entonces, una clase de comando es una buena manera de unir las acciones hacia adelante y hacia atrás. Por ejemplo:

class MoveFileCommand(object): def __init__(self, src, dest): self.src = src self.dest = dest os.rename(self.src, self.dest) def undo(self): os.rename(self.dest, self.src) undo_stack = [] undo_stack.append(MoveFileCommand(''foo.txt'', ''bar.txt'')) undo_stack.append(MoveFileCommand(''bar.txt'', ''baz.txt'')) # foo.txt is now renamed to baz.txt undo_stack.pop().undo() # Now it''s bar.txt undo_stack.pop().undo() # and back to foo.txt


Hice alguna búsqueda y encontré esto. Parece que hace el trabajo de encapsular una acción.

def demo(a,b,c): print ''a:'',a print ''b:'',b print ''c:'',c class Command: def __init__(self, cmd, *args): self._cmd=cmd self._args=args def __call__(self, *args): return apply(self._cmd, self._args+args) cmd=Command(dir,__builtins__) print cmd() cmd=Command(demo,1,2) cmd(3)


Sí, se pierde algo: el patrón de comando solo es necesario en idiomas que no tienen punteros de función (o funciones como objetos de primera clase), como Java. En lenguajes con funciones como objetos, puede utilizar la función en sí misma; no es necesario tener un objeto de comando separado (que luego debe tener un método "doit").

En el ejemplo que podría citar, la llamada a getattr() le da el "objeto de comando" (es decir, el método enlazado); agregando paréntesis después de que "invoca" (es decir, llama) el objeto de comando.


Si recuerdo correctamente la cuadrilla de cuatro, el patrón de Comando se trata de comandos como "Archivo - Guardar", no de comandos como "svn commit", que es para lo que sirve su código.

Martin sugiere que el patrón de Comando no es necesario porque las funciones como objetos de primera clase toman su lugar, pero el patrón de Comando es más rico que solo doit() , que tiene, por ejemplo, también undo() , is_enabled() , etc.