En python est-il possible d'exécuter chaque fonction dans une classe? Ce que j'essaie de faire est d'appeler les fonctions à l'intérieur d'une classe, collecter leurs variables de retour et de travailler avec cela.Pour chaque fonction en classe dans python
Répondre
Cela dépend de ce que vous entendez par "fonction". Quelque chose comme cela pourrait fonctionner, si:
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))
Puis:
class C:
def f(self): pass
>>> list(methods(C))
[<unbound method C.f>]
oui, vous pouvez. rapide et sale:
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 vous voulez un concept plus raffiné, vérifiez le module unittest.py. Il devrait y avoir un code qui exécute toutes les méthodes en commençant par la chaîne "test"
Voici un qui utilise le rendement en boucle à travers les fonctions de la classe.
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())]))
Depuis que vous avez écrit la classe, vous avez déjà connaissez toutes les fonctions.
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>]
Oui, mais cela viole le principe Ne vous répétez pas. En outre, il peut ne pas posséder le code qu'il veut exercer, ou ne pas vouloir ajouter des turds inutiles. –
ne semble pas violer DRY pour moi. Vous pouvez facilement avoir des méthodes que vous ne voulez pas appelées automagiquement. Ceci identifie positivement la liste des méthodes qui sont appelées. –
Essayez d'utiliser le 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()
Sortie:
ducks
eggs
Le dir
builtin répertorie tous les attributs d'un objet, par exemple:
>>> 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 travaille également sur une classe initialisés ..
>>> c = MyClass()
>>> dir(c)
['__doc__', '__module__', 'one', 'three', 'two']
Les méthodes sont les attributs juste qui se trouvent être appelable (via c.attribute()
) - nous pouvons utiliser la fonction getattr
pour faire référence à cette méthode par une variable ..
>>> myfunc = getattr(c, 'one')
>>> myfunc
<bound method MyClass.one of <__main__.MyClass instance at 0x7b0d0>>
Ensuite, nous pouvons simplement appeler cette variable ..
>>> myfunc()
one # the output from the c.one() method
Étant donné que certains attributs ne sont pas des fonctions (dans l'exemple ci-dessus, __doc__
et __module__
). Nous pouvons nous le callable builtin pour vérifier si elle est une méthode appelable (fonction):
>>> callable(c.three)
True
>>> callable(c.__doc__)
False
donc de combiner tout cela dans une boucle:
>>> for cur_method_name in dir(c):
... the_attr = getattr(c, cur_method_name)
... if callable(the_attr):
... the_attr()
...
one
three
two
Rappelez-vous ceci appellera des méthodes telles que __init__
à nouveau, qui n'est probablement pas désiré.Vous pouvez ignorer tout cur_method_name
qui commence par un trait de soulignement
- 1. getResourceAsStream ne fonctionne pas pour chaque classe?
- 2. Python: Pour chaque élément de la liste appliquer une fonction dans la liste
- 3. Rendre une variable globale accessible pour chaque fonction dans une classe
- 4. Sortir d'une fonction en Python
- 5. Comment parcourir une liste en répétant chaque élément en Python
- 6. définitions de fonction Rediriger en python
- 7. Comment faire référence à une méthode de classe en dehors d'un corps de fonction en Python?
- 8. Comment obtenir l'instance de module pour une classe en Python?
- 9. En utilisant Python pour exécuter une commande sur chaque fichier dans un dossier
- 10. Interprète Python en tant que classe C++
- 11. Objet de base de données pour chaque classe ou site?
- 12. Comment créer une classe Python en C?
- 13. Définition de classe auto-référencée en python
- 14. fonction php pour diviser un tableau à chaque ligne vide?
- 15. Test pour ImportErrors en Python
- 16. Aide - Pointeurs de fonction en Python
- 17. Python réflexion super classe
- 18. Python curses.ascii en fonction des paramètres régionaux?
- 19. Convertir une chaîne en objet de classe Python?
- 20. ctypes en python, problème appelant une fonction dans une DLL
- 21. Suggestions pour la fonction assert python
- 22. Comment définir une classe en Python
- 23. faire une fonction statique/classe en dehors de la classe
- 24. Python: Passer un nom de classe en tant que paramètre à une fonction?
- 25. Construit en fonction de hachage python()
- 26. Comment bande décorateurs d'une fonction en python
- 27. Puis-je supprimer une classe allouée dynamiquement en utilisant une fonction dans cette classe?
- 28. fonction similaire à str_replace de php en python?
- 29. Comment créer une instance d'une classe dans une autre classe en Python
- 30. python: fonction timeit() lente
-1 Pour coller l'expression entière dans l'instruction return qui la rend totalement illisible. –