2010-12-07 15 views
5

me gustaría llamar a todos los métodos de una instancia de objeto pitón con un conjunto dado de argumentos, es decir, para un objeto comoPython: Call todos los métodos de un objeto con un conjunto dado de argumentos

class Test(): 
    def a(input): 
     print "a: " + input 
    def b(input): 
     print "b: " + input 
    def c(input): 
     print "c: " + input 

I le gustaría escribir un método dinámico que permite que corra

myMethod('test') 

resultando en

a: test 
b: test 
c: test 

iterando sobre todo de prueba() - m ethods. ¡Gracias de antemano por tu ayuda!

Respuesta

10

No exactamente seguro de por qué quiere hacer esto. Normalmente, en algo así como unittest, proporcionarías una entrada en tu clase y luego harías referencia dentro de cada método de prueba.

Uso de inspeccionar y dirigir.

from inspect import ismethod 

def call_all(obj, *args, **kwargs): 
    for name in dir(obj): 
     attribute = getattr(obj, name) 
     if ismethod(attribute): 
      attribute(*args, **kwargs) 

class Test(): 
    def a(self, input): 
     print "a: " + input 
    def b(self, input): 
     print "b: " + input 
    def c(self, input): 
     print "c: " + input 

call_all(Test(), 'my input') 

Salida:

a: my input 
b: my input 
c: my input 
+0

perfecto, gracias. Usaré este tipo de patrón para una tarea de evaluación de reglas, no para una unidad o un doctesting. – sam

1

Realmente no desea hacer esto. Python se envía con dos marcos de prueba muy agradables: vea los módulos unittest y doctest en la documentación.

Pero se puede intentar algo como:

def call_everything_in(an_object, *args, **kwargs): 
    for item in an_object.__dict__: 
     to_call = getattr(an_object, item) 
     if callable(to_call): to_call(*args, **kwargs) 
Cuestiones relacionadas