Я использую конструктор базового класса в качестве фабрики и меняю класс в этом конструкторе/фабрике, чтобы выбрать соответствующий класс - является ли этот подход хорошей практикой python или есть более элегантные способы?
Я пытался прочитать справку о метаклассах, но без особого успеха.
Вот пример того, что я делаю.
class Project(object):
"Base class and factory."
def __init__(self, url):
if is_url_local(url):
self.__class__ = ProjectLocal
else:
self.__class__ = ProjectRemote
self.url = url
class ProjectLocal(Project):
def do_something(self):
# do the stuff locally in the dir pointed by self.url
class ProjectRemote(Project):
def do_something(self):
# do the stuff communicating with remote server pointed by self.url
Имея этот код, я могу создать экземпляр ProjectLocal/ProjectRemote через базовый класс Project:
project = Project('http://example.com')
project.do_something()
Я знаю, что альтернативным способом является использование функции ткани, которая вернет объект класса на основе URL-адреса, тогда код будет выглядеть аналогично:
def project_factory(url):
if is_url_local(url):
return ProjectLocal(url)
else:
return ProjectRemote(url)
project = project_factory(url)
project.do_something()
Является ли мой первый подход просто делом вкуса или в нем есть какие-то подводные камни?