Python管理依赖项的方法

Python管理依赖项的方法,python,Python,所以在PHP中,我们通常通过构造函数传递依赖项 像 我想了解python开发人员如何在类内使用服务的建议。我不指望它在全局范围内,我会让它成为类级别的成员 class Downloader(): logger = logging.getLogger('mylogger') def download(self): logger.alert('I am downloading..') class Downloader(): def __init__(sel

所以在PHP中,我们通常通过构造函数传递依赖项


我想了解python开发人员如何在类内使用服务的建议。

我不指望它在全局范围内,我会让它成为类级别的成员

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

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

    def download(self):
        self.logger.alert('I am downloading..')
或实例级成员

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

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

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

那要看情况了。如果文件或模块中的所有类都有一些不需要修改的通用类,那么我倾向于直接使用它,而不通过构造函数传递它,或者,如果我想在继承的类中修改它,我会在类级别定义一个变量

在您的例子中,如果downloader类(以及从它继承的所有类)总是使用同一个记录器,那么我认为您现在使用它的方式没有问题

# 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')

在我的例子中,我喜欢只在类本身中引用依赖项

class Downloader():
    logger = logging.getLogger('mylogger')
    def download():
        logger.alert('I am downloading..')
另一种选择是在类创建时将依赖项作为参数传递

logger = logging.getLogger('mylogger')

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

downloader = Download(logger)

类似于记录器的东西,您不一定想要注入;与在PHP中执行
错误日志('Foo!')
相同。OOP实践在这方面并没有什么不同。这是因为从Downloader()的角度来看,
logger
global
。您还可以将依赖项传递给类uuu init_uuuu()函数。这并没有多大区别。如果你把它写在模块的范围内,你完全可以相信它的存在。所以我得出结论,这里是需要与最佳实践宣传的对比