Elige una subclase basada en un parámetro

Tengo un módulo (db.py) que carga datos de diferentes tipos de bases de datos (sqlite, mysql, etc.) el módulo contiene una clase db_loader y subclases (sqlite_loader, mysql_loader) que heredan de él.

El tipo de base de datos que se está utilizando está en un archivo de parámetros separado,

¿Cómo obtiene el usuario el objeto correcto?

es decir, cómo hago:

loader = db.loader()

¿Utilizo un método llamado cargador en el módulo db.py o hay una forma más elegante de que una clase pueda elegir su propia subclase en función de un parámetro? ¿Hay una manera estándar de hacer este tipo de cosas?

Suena como si quisieras el patrón de fábrica . Usted define un método de fábrica (ya sea en su módulo, o quizás en una clase padre común para todos los objetos que puede producir) al que le pasa el parámetro, y devolverá una instancia de la clase correcta. En Python, el problema es un poco más simple que tal vez algunos de los detalles en el artículo de wikipedia, ya que sus tipos son dynamics.

 class Animal(object): @staticmethod def get_animal_which_makes_noise(noise): if noise == 'meow': return Cat() elif noise == 'woof': return Dog() class Cat(Animal): ... class Dog(Animal): ... 

Almaceno el nombre de la subclase en el archivo params y tengo un método de fábrica que ejemplifica la clase dado su nombre:

 class loader(object): @staticmethod def get_loader(name): return globals()[name]() class sqlite_loader(loader): pass class mysql_loader(loader): pass print type(loader.get_loader('sqlite_loader')) print type(loader.get_loader('mysql_loader')) 

Almacene las clases en un dict , ejemplifique la correcta según su parámetro:

 db_loaders = dict(sqlite=sqlite_loader, mysql=mysql_loader) loader = db_loaders.get(db_type, default_loader)() 

donde db_type es el parámetro que está activando, y sqlite_loader y mysql_loader son las clases “loader”.