Chargement dynamique de classes

Chargement dynamique de classes - Python - Programmation

Marsh Posté le 11-02-2013 à 17:02:10    

Hello,
 
Je suis en train de développer un petit script pour utiliser la fonctionnalité ENC (External Node Classifier) de puppet.
 
Le but de mon programme est que pour un mot clé donné (qui correspond à un objectClass dans un annuaire LDAP), une classe Python réalise un job.
 
Je possède donc un module python "mappers" avec dedans un fichier __init__.py et un ensemble de classes :
 - AbstractMapper qui est une classe "abstraite" représentant un mapper
 - un mapper par service (NtpServiceMapper, NetworkInterfaceMapper, TomcatInstanceMapper, etc...)
 
Le but est que le chargement de ces classes soit dynamique, pour que quand on souhaite ajouter un nouveau service, il suffit d'ajouter le schéma LDAP, la classe python (et bien sur, l'utiliser dans l'annuaire...).
 
Je voudrais donc avoir un système de factory, qui dit que pour un objectClass donné, j'associe un mappeur via une instanciation de sa classe.
 
Si je vois comment faire tout simplement dans plusieurs langages, comme Java ou PHP, j'ai un peu plus de mal avec Python... En java, j'aurais défini un bloc static {} dans chacun de mes mappers, qui se seraient référencés tout seul auprès de la factory, via la ligne suivante :

Code :
  1. MapperFactory.add("ntpService", new NtpServiceMapper());


 
Est-il possible d'avoir un comportement plutôt similaire en Python ?  
 
Depuis mon code principal, j'ai déjà réussi (je pense) à charger toutes les classes en ajoutant le dossier "mappers" (présent dans le même répertoire que mon script, soit __file__) et en faisant un :

Code :
  1. from mappers import *


 
Merci d'avance pour vos réponses, je suis sur que ça doit être "tout con", mais bon.. :(

Reply

Marsh Posté le 11-02-2013 à 17:02:10   

Reply

Marsh Posté le 13-02-2013 à 12:02:48    

  • Tu fais l'enregistrement explicitement dans ton fichier (un module Python, c'est du code exécuté, donc rien ne t'empêche de faire suivre chaque déclaration de classe par un truc genre "mappers.append(Class)"
  • Tu fais l'enregistrement en automagique via une métaclasse (il te faut une métaclasse — et probablement une classe — de base)
  • À partir d'une classe de base, tu traverses récursivement ses sous-classes


C'est comme tu préfères. Tu as déjà une classe de base donc 3 peut être appliqué directement.

 

Et pas besoin d'un star-import pour charger les classes, `import mappers` devrait suffire.


Message édité par masklinn le 13-02-2013 à 12:04:54

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed