Uso el constructor de la clase base como fábrica y cambio de clase en este constructor/fábrica para seleccionar la clase adecuada. ¿Este enfoque es una buena práctica de Python o hay formas más elegantes?¿Utiliza el constructor de la clase base como fábrica en Python?
He intentado leer ayuda sobre metaclases pero sin gran éxito.
Aquí un ejemplo de lo que estoy haciendo.
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
Tener el código que puede crear la instancia de ProjectLocal/ProjectRemote a través de la clase base del proyecto:
project = Project('http://example.com')
project.do_something()
sé que Otra alternativa es el uso de la función de la tela que devolverá el objeto de clase basado en URL , entonces el código se verá similar:
def project_factory(url):
if is_url_local(url):
return ProjectLocal(url)
else:
return ProjectRemote(url)
project = project_factory(url)
project.do_something()
¿Mi primer enfoque es solo cuestión de gusto o tiene algunas trampas ocultas?
+1: No intente hacer que la clase base haga nada más que ser la clase base. Las fábricas están siempre separadas. –
Otra buena opción para definir fábricas es classmethods: le dan parametrización de clases de forma gratuita mediante el argumento 'cls'. – andreypopp