Я использую конструктор базового класса в качестве фабрики и меняю класс в этом конструкторе / фабрике, чтобы выбрать подходящий класс - это хороший подход к 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()
Мой первый подход - дело вкуса или в нем есть какие-то скрытые подводные камни?