基于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包中将功能模块写好,然后去配置文件中配置相对应的配置信息即可,这大大加强了我们程序的解耦合程度。

 

posted @ 2022-03-29 15:14  _yessir  阅读(50)  评论(0编辑  收藏  举报