выбрать подкласс на основе параметра - PullRequest
4 голосов
/ 01 сентября 2011

У меня есть модуль (db.py), который загружает данные из разных типов баз данных (sqlite, mysql и т. Д.), Модуль содержит класс db_loader и подклассы (sqlite_loader, mysql_loader), которые наследуются от него.

Тип используемой базы данных находится в отдельном файле параметров,

Как пользователь получает нужный объект обратно?

т.е. как мне это сделать:

loader = db.loader()

Использую ли я метод с именем loader в модуле db.py или есть более элегантный способ, с помощью которого класс может выбирать свой собственный подкласс на основе параметра?Есть ли стандартный способ сделать это?

Ответы [ 3 ]

6 голосов
/ 01 сентября 2011

Звучит так, как вы хотите Заводская модель .Вы определяете фабричный метод (либо в вашем модуле, либо, возможно, в общем родительском классе для всех объектов, которые он может производить), в который вы передаете параметр, и он возвращает экземпляр правильного класса.В Python проблема немного проще, чем, возможно, некоторые детали статьи в Википедии, так как ваши типы являются динамическими.

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):
    ...
2 голосов
/ 01 сентября 2011

Храните классы в dict, создавайте правильные классы на основе вашего параметра:

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

где db_type - это параметр, который вы включаете, а sqlite_loader и mysql_loader - классы "загрузчика".

2 голосов
/ 01 сентября 2011

Я бы сохранил имя подкласса в файле params и имел бы фабричный метод, который бы создавал экземпляр класса, учитывая его имя:

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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...