基于Django框架的编程思想
在Django框架中,我们可以看到,通过在settings文件中的某个配置列表内添加上对应的字符串,就相当于导入了某个模块里面的类功能,如下:
从上图中我们可以看出来,Django配置文件中的字符串其实就是某个模块功能,那么,他是如何做到的,我们能不能像Django一样通过字符串来导入模块呢??当然可以,在这之前,我们需要来了解一个模块功能:importlib
importlib
importlib就是可以通过字符串来导入模块,具体功能如下代码演示:
1 ''' 2 设置一个myfile文件夹,文件夹内包含一个b.py文件,
myfile文件夹与当前文件在同一层级 3 ''' 4 5 # 模块:importlib 6 import importlib 7 res = 'myfile.b' 8 ret = importlib.import_module(res) # from myfile import b 9 # 该方法最小只能到py文件名 10 print(ret)
从上面的代码演示结果来看,我们就可以通过字符串的形式导入模块,下面,我们开始利用该模块功能来模拟Django的配置文件编程思想。
通过Django配置文件编程思想实现配置文件注册功能:
首先我们先建立如下图所示的文件:其中notify是一个包,包中包含了__init__.py 、email.py 、 qq.py 以及wechat.py等文件,并在跟notify同一层级创建了settings.py和start.py两个py文件:
文件中的具体代码如下:
1 ''' 2 基于Django的编程思想,在配置文件的列表中配置字符串,就可以导入某个功能: 3 目录如下: 4 notify文件夹 5 __init__.py 6 email.py 7 qq.py 8 wechat.py 9 start.py 10 settings.py 11 12 ''' 13 14 # settings.py 15 import notify 16 17 path_str = [ 18 'notify.email.Email', 19 'notify.qq.QQ', 20 'notify.wechat.Wechat', 21 'notify.msn.Msn', 22 ] 23 24 ******************************************************************* 25 # email.py 其他的qq/wechat同 26 class Email(object): 27 def __init__(self): 28 pass # 发送qq前期需要的准备工作 29 30 def send(self,content): 31 print('邮箱发送的消息:%s' % content) 32 33 ******************************************************************* 34 # __init__.py 35 import settings 36 import importlib 37 38 def send_all(content): 39 for path_str in settings.NOTIFY_LIST: #'notify.email.Email' 40 module_path,class_name = path_str.rsplit('.',maxsplit=1) 41 # module_path = 'notify.email' class_name = 'Email' 42 # 1 利用字符串导入模块 43 module = importlib.import_module(module_path) # from notify import email 44 # 2 利用反射获取类名 45 cls = getattr(module,class_name) # Email、QQ、Wechat 46 # 3 生成类的对象 47 obj = cls() 48 # 4 利用鸭子类型直接调用send方法 49 obj.send(content) 50 51 ****************************************************************** 52 # start.py 53 import notify 54 55 notify.send_all('给我来把98K') 56
这样,我们只需要在start.py中传入content参数,就可以通过qq / email / wechat等发送消息,如果不想使用某个功能,只需要去配置文件中将对应的配置注释掉即可,添加其他的功能时也一样,我们只需要在notify包中将功能模块写好,然后去配置文件中配置相对应的配置信息即可,这大大加强了我们程序的解耦合程度。