2010-03-12 9 views

Respuesta

7

Toman parámetros y devuelven un resultado según esos parámetros.

A callable es simplemente una forma abstracta de una función resp una interfaz que define que un objeto actúa como una función (es decir, acepta parámetros).

Como las funciones son objetos de primera clase, es obvio que las funciones son objetos invocables. Si está hablando sobre el método __call__, este es solo uno de los muchos métodos especiales con los que puede sobrecargar el comportamiento de los objetos personalizados, p. para operaciones aritméticas o también definir qué pasa si llama al un objeto.

Una idea para usar es tener algún tipo de objeto de fábrica que a su vez crea otros objetos.

+1

1: ver pregunta relacionada: http://stackoverflow.com/questions/111234/ what-is-a-llama-en-python – rmk

12

Hay muchos tipos de objetos son exigibles en Python, y que puede servir para muchos propósitos:

  • funciones son exigibles, y pueden llevar a lo largo de un "cierre" de una función externa
  • clases son exigibles, y llamar a una clase en la que obtiene una instancia de esa clase
  • métodos son exigibles, por el comportamiento de funciones como perteneciente a una instancia específica
  • staticmethods y classmethods son exigibles, para la funcionalidad método similar cuando el funcionalidad se refiere a "toda una clase" en algún sentido (utilidad staticmethods' es dudosa, ya que un classmethod podría hacer igual de bien ;-)
  • generadores son exigibles, y llamar a un generador que obtiene un objeto iterador
  • finalmente, y esto puede ser específicamente por lo que estaba preguntando (sin darse cuenta de que todos los anteriores también son objetos ... !!!), puede codificar una clase cuyas instancias son invocables: esto es a menudo el más simple forma de tener llamadas que actualicen el estado de una instancia, así como depender de él (aunque una función con un cierre adecuado, y un método enlazado, ofrezca alternativas, una instancia invocable es la que ay para ir cuando necesite realizar llamadas y alguna otra operación específica en el mismo objeto: para el ejemplo , un objeto que desea llamar pero también aplicar indexación para tener mejor sea una instancia de una clase eso es tanto invocable como indexable ;-).

Una gran variedad de ejemplos del tipo de "problemas que resuelven" es ofrecida por la biblioteca estándar de Python, que tiene muchos casos de cada uno de los tipos específicos que menciono arriba.

1

Existen áreas, especialmente en las funciones de funciones de llamada de las funciones, donde los objetos permiten menos anidamiento.

Considere hacer un decorador clásico que verifique un nivel de autorización antes de llamar a una función.El uso es claro:

@check_authorization(level="Manager") 
def update_price(Item, new_price):... 

usted puede hacer esto funciona como anidados:

def check_authorization(level): 
    def take_params(function): 
     def concrete(*args, **kwargs): 
      if user_level_greater_than(level): 
       return function(*args, 
        **kwargs) 
      return None 
     return concrete 
    return take_params 

o usted podría a esto como una clase, lo que podría ser más claro:

class check_authorization(object): 
     def __init__(level): 
     self.level = level 
     def __call__(function): 
      self.function = function 
      return self.dec 
     def dec(self, *args, **kwargs): 
      if user_level_greater_than(self.level): 
      return self.function(*args,v**kwargs) 
      return None 

Muchos encuentra este método plano más claro. Por supuesto, creo en la trampa, porque me gustan las firmas y los metadatos correctos:

from dectools.dectools import make_call_if 

@make_call_if 
def check_authorization(function, arg, kwargs, level): 
    return user_level_greater_than(level) 

El objeto exigible es una herramienta que es bueno para algunas aplicaciones conocidas y también puede ser bueno para el extraño problema de la vida real depare tú.

Cuestiones relacionadas