Python管理依赖项的方法
所以在PHP中,我们通常通过构造函数传递依赖项 像Python管理依赖项的方法,python,Python,所以在PHP中,我们通常通过构造函数传递依赖项 像 我想了解python开发人员如何在类内使用服务的建议。我不指望它在全局范围内,我会让它成为类级别的成员 class Downloader(): logger = logging.getLogger('mylogger') def download(self): logger.alert('I am downloading..') class Downloader(): def __init__(sel
我想了解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()函数。这并没有多大区别。如果你把它写在模块的范围内,你完全可以相信它的存在。所以我得出结论,这里是需要与最佳实践宣传的对比