2009-04-13 18 views
5

¿En python es posible ejecutar cada función dentro de una clase?Para cada función en clase dentro de python

EDIT: Lo que estoy tratando de hacer es llamar a las funciones dentro de una clase, recoger sus variables de retorno y trabajar con eso.

Respuesta

3

Depende de lo que quiere decir "función". Algo como esto podría funcionar, sin embargo:

import inspect 

def methods(c): 
    return (m for m in (getattr(c, d) for d in dir(c)) 
      if inspect.ismethoddescriptor(m) or inspect.ismethod(m)) 

continuación:

class C: 
    def f(self): pass 

>>> list(methods(C)) 
[<unbound method C.f>] 
+0

-1 Para pegar toda la expresión en la declaración de devolución que hace que sea completamente ilegible. –

4

sí, puede. rápida y sucia:

class foo: 
    def one(self): 
     print "here is one" 
    def two(self): 
     print "here is two" 
    def three(self): 
     print "here is three" 


obj = foo() 
for entry in dir(obj): 
    print entry, callable(getattr(obj,entry)) 
    if callable(getattr(obj,entry)): 
     getattr(obj,entry)() 

Si desea un concepto más refinado, compruebe el módulo de unittest.py. Debe haber un código que ejecute todos los métodos comenzando con la cadena "test"

1

Esta es la que utiliza el rendimiento de bucle a través de las funciones de la clase.

def get_functions(mod): 
    for entry in dir(mod): 
     obj=getattr(mod,entry); 
     if hasattr(obj, '__call__') and hasattr(obj,'__func__') : 
      yield obj 

class foo: 
    def one(self): 
     print ("here is two") 
     return 1 
    def two(self): 
     print ("here is two") 
     return 2 
    def three(self): 
     print ("here is three") 
     return 3 


print(sum([fun() for fun in get_functions(foo())])) 
1

Desde que escribió la clase, que ya sabe todas las funciones.

class ThisIsPeculiar(object): 
    def aFunction(self, arg1): 
     pass 
    def anotherFunction(self, thisArg, thatArg): 
     pass 
    functionsToCall = [ aFunction, anotherFunction ] 

>>> p= ThisIsPeculiar() 
>>> p.functionsToCall 
[<function aFunction at 0x6b830>, <function anotherFunction at 0x6b870>] 
+0

Sí, pero eso viola el principio de No repetirme. Además, es posible que no sea el propietario del código que desea ejercer, o que no quiera agregar turds innecesarios. –

+0

Parece que no viola DRY para mí. Puede tener fácilmente métodos que no desea denominados automágicamente. Esto identifica positivamente la lista de métodos que se llaman. –

1

Trate de usar el inspect module:

import inspect 

class Spam: 
    def eggs(self): 
     print "eggs" 
    def ducks(self): 
     print "ducks" 
    value = "value" 

spam = Spam() 
for name, method in inspect.getmembers(spam, callable): 
    method() 

Salida:

ducks 
eggs 
3

El dir builtin una lista de todos los atributos de un objeto, por ejemplo:

>>> class MyClass: 
...  def one(self): 
...   print "one" 
...  def two(self): 
...   print "two" 
...  def three(self): 
...   print "three" 
... 
>>> dir(MyClass) 
['__doc__', '__module__', 'one', 'three', 'two'] 

I t también trabaja en una clase inicializado ..

>>> c = MyClass() 
>>> dir(c) 
['__doc__', '__module__', 'one', 'three', 'two'] 

métodos son sólo atributos que resultan ser exigible (a través de c.attribute()) - podemos utilizar la función getattr hacer referencia a ese método a través de una variable ..

>>> myfunc = getattr(c, 'one') 
>>> myfunc 
<bound method MyClass.one of <__main__.MyClass instance at 0x7b0d0>> 

Entonces podemos simplemente llamamos esa variable ..

>>> myfunc() 
one # the output from the c.one() method 

Debido a que algunos atributos no son funciones (en el ejemplo anterior, __doc__ y __module__). Nosotros nos podemos el callable builtin para comprobar si se trata de un método invocable (una función):

>>> callable(c.three) 
True 
>>> callable(c.__doc__) 
False 

Así que para combinar todo esto en un bucle:

>>> for cur_method_name in dir(c): 
...  the_attr = getattr(c, cur_method_name) 
...  if callable(the_attr): 
...    the_attr() 
... 
one 
three 
two 

Recuerde que este llamará métodos como __init__ nuevo, lo cual probablemente no sea deseado.Es posible que desee omitir cualquier cur_method_name que comience con un carácter de subrayado

Cuestiones relacionadas