¿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.
¿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.
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>]
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"
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())]))
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>]
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. –
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. –
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
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
-1 Para pegar toda la expresión en la declaración de devolución que hace que sea completamente ilegible. –