Appeler une methode de classe via chaine de caracteres

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'ai un petit soucis en Python.

Je dispose d'une collection de classes dans divers modules qui ont pour particularite d'heriter d'une classe avec une methode de classe particuliere.

Je recois le nom de mes classes sous forme de chaine de caracteres et je voudrais etre en mesure d'appeler la methode de classe a partir de cela.

Si la classe est dans le meme module, ceci marche:

1
2
s = 'A'
eval(s).method()

Mais pour des classes hors du module, rien a faire.
J'ai essaye '''global()[s]''', ou en ne gardant que la derniere partie du chemin (et pas module.nom) mais dans tous les cas la clef n'est pas trouvee.

Si vous aviez des idees. :(

Je m'étais posé la question de l'introspection en Python par curiosité (pour voir à quoi ressemblait l'API dans plein de langages) et j'étais tombé là-dessus :

http://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class

Et là-dessus : https://docs.python.org/2/library/inspect.html

En attendant les spécialistes de Python j'espère que ça pourra te mettre sur une piste.

Bon courage.

+0 -0

Tu utilise quelle version de python ? Car si tu es sur du 3.4 une solution est d'appliquer la metaclass des classes abstraite a la class mère. Car outre vérifier que tu implémente bien toutes les méthodes abstraite, la méta class garde une trace de toutes les class dérivé qu'il est alors facile de récupérer.

Dans le cas contraire tu dois pouvoir t'en sortir avec eval en lui passant les bon dictionnaire sur les arguments optionnels global et local mais c'est assez moche (et dangereux)

Salut,

En fait j'ai trouve ce qui n'allait pas. Je n'importais pas le module correctement.

Pour le coup j'utilise ce petit helper:

1
2
3
4
5
6
7
def getClass(cls):
    parts = cls.split('.')
    module = ".".join(parts[:-1])
    m = __import__( module )
    for comp in parts[1:]:
        m = getattr(m, comp)            
    return m

Qui m'importe correctement ce dont j'ai besoin.

J'utilise Python 2.x.

+0 -0

Je me permets juste une toute petite remarque : dans ce genre de cas (chargement dynamique d'un plugin ou d'une extension), il vaut mieux utiliser la fonction import_module() du module standard importlib plutôt que la builtin __import__.

Du moins c'est ce qui est recommandé par la doc. Je ne saurais plus te ressortir les tenants et les aboutissants de cette guideline de tête, par contre. Certainement une question de contrôle et de simplicité…

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte