Entonces, en PHP, normalmente pasamos nuestras dependencias a través del constructor.

Como

<?php

class Downloader
{
    public function __construct(LoggerInterface $logger){}

}

Pero en Python (soy principiante), veo que podemos usar objetos definidos fuera del alcance de la clase que se pueden usar directamente.

logger = logging.getLogger('mylogger')

class Downloader():
    def download():
        logger.alert('I am downloading..')

Quiero entender las recomendaciones de cómo los desarrolladores de Python usan los servicios dentro de la clase.

1
Raheel 31 oct. 2017 a las 17:56

3 respuestas

La mejor respuesta

Bueno, eso depende. Si hay algo que no va a mutar y es común para todas las clases en un archivo o módulo, entonces tiendo a usarlo directamente sin pasarlo por el constructor, o de lo contrario, defino una variable a nivel de clase, si quiero modificarlo en clases heredadas.

En su caso, si la clase de descarga (y todos los que heredan de ella) siempre van a usar el mismo registrador, entonces no veo ningún problema en usarlo como lo está haciendo en este momento.

# Case 1
# In case you want to allow logger being different for inherited classes.

class BaseDownloader(object):

      logger = Logger1

class Downloader1(BaseDownloader):

      logger = Logger2

# Case 2
# In case you want different logger for every instance

class Downloader(object):

      def __init__(self, logger):
           self.logger = logger

# Case 3
# If you don't need that kind of customizability, then using it directly
# is perfectly fine. In fact, that's how I'd start with, and change it
# later if the need arises.

class Downloader(object):

      def download():
          logger.alert('I am downloading')
1
hspandher 31 oct. 2017 a las 15:07

En mi caso, me gusta solo instanciar dependencias en la clase misma

class Downloader():
    logger = logging.getLogger('mylogger')
    def download():
        logger.alert('I am downloading..')

Otra opción sería pasar la dependencia como argumento en la creación de la clase.

logger = logging.getLogger('mylogger')

class Downloader():
    def __init__(self, logger):
        self.logger = logger
    def download():
        logger.alert('I am downloading..')

downloader = Download(logger)
1
Yardid 31 oct. 2017 a las 15:03

No dependería de que tenga un alcance global, o lo convertiría en un miembro de nivel de clase

class Downloader():
    logger = logging.getLogger('mylogger')

    def download(self):
        logger.alert('I am downloading..')

O miembro de nivel de instancia

class Downloader():
    def __init__(self):
        self.logger = logging.getLogger('mylogger')

    def download(self):
        self.logger.alert('I am downloading..')
1
CoryKramer 31 oct. 2017 a las 14:59