首页 > 编程语言 >一种编程思想——利用settings文件实现功能的增减

一种编程思想——利用settings文件实现功能的增减

时间:2023-10-29 21:36:43浏览次数:39  
标签:__ 编程 settings py send content notify 增减 def

一. 正常函数版本的思路

1. notify.py

def wechat(content):
print('微信通知:%s'%content)


def qq(content):
    print('qq通知:%s'%content)


def email(content):
    print('邮箱通知:%s'%content)

 

2. start.py

from notify import *


def send_all(content):
    wechat(content)
    qq(content)
    email(content)

if __name__ == '__main__':
    send_all('这是消息通知')

 

二. 模仿django的settings.py中多处利用指定字符串到类名的形式, 就可以通过字符串获取并执行相应的类中的方法和功能.

1. 目录结构

# 在一个包中有好几个模块
notify/  # 包
    ├── __init__.py
    ├── email.py
    ├── qq.py
    └── wechat.py
├── settings.py
└── start.py

 

2. notify

2-1. __init__.py

import settings
import importlib


def send_all(content):
    for path_str in settings.NOTIFY_LIST:  # 'notify.email.Email'
        module_path, class_name = path_str.rsplit('.', maxsplit=1)
        # module_path = 'notify.email'  class_name = 'Email'
        # 1 利用字符串导入模块
        module = importlib.import_module(module_path)  # from notify import email
        # 2 利用反射获取类名
        cls = getattr(module, class_name)  # Email、QQ、Wechat
        # 3 生成类的对象
        obj = cls()
        # 4 利用鸭子类型直接调用send方法
        obj.send(content)

 

2-2. email.py

class Email(object):
    def __init__(self):
        pass  # 发送邮箱需要做的前期准备工作

    def send(self, content):
        print('邮箱通知:%s' % content)

 

2-3. qq.py

class QQ(object):
    def __init__(self):
        pass  # 发送qq需要做的前期准备工作

    def send(self, content):
        print('QQ通知:%s' % content)

 

2-4. wechat.py

class WeChat(object):
    def __init__(self):
        pass  # 发送微信需要做的前期准备工作

    def send(self, content):
        print('微信通知: %s' % content)

 

3. settings.py

# 配置文件中以字符串的格式保存需要导入的内容
    NOTIFY_LIST = [
        'notify.email.Email',
        'notify.qq.QQ',
        'notify.wechat.WeChat',
        # 'notify.msg.Msg',
    ]

 

4. start.py

# 用户需要发送消息通知只需要导入import notify即可操作使用实现一键发送消息
import notify

notify.send_all('这是消息通知')

 

5. 中心思想总结

利用了面向对象以及面向对象的多态性(鸭子类型),
再通过定制配置文件并存放不同功能类的字符串路径,
接着使用导入包就是导入__init__.py文件的特性, 在包中定义一个方法,
方法中用importlib就轻松的导入了需要的模块.
再拿到这个模板通过获取的字符串路径最后一个类的字符串进行反射就实现了可以同时进行多个类中功能的集合.
合理的运用这种思想, 就可以只修改settings.py中的路径地址, 并合理的增添 或者 关闭某些功能. 重要的是关闭只需要注释即可.

  

标签:__,编程,settings,py,send,content,notify,增减,def
From: https://www.cnblogs.com/wellplayed/p/17796528.html

相关文章

  • python两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比
    两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单实例#!/usr/bin/python#-*-coding:UTF-8-*-foriinrange(ord('x'),ord('z')+1):forjinra......
  • EDA工具使用+GIT操作+python编程+C语言编程+Riscv相关+TCL操作
    EDA工具使用Verdi覆盖率转网页urg-full64-dirsimv.vdbVerdi加载sessionverdi-ssrsessionFileVcs分部编译额外选项-partcomp:自动分块编译。-fastpartcomp:使用多核计算系统并行部分编译。-pcmakeprof:查看每部分编译占用的时间,方便对时间更久的进行拆分。-partc......
  • C++多线程编程——线程的基本概念和使用方法
    什么是线程?在计算机科学中,线程是进程中的一个执行控制单元,也被称为执行路径。每个进程可以包含多个线程,每条线程并行执行不同的任务。线程是操作系统可识别的最小执行和调度单位。进程和线程的区别进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的......
  • Unix/Linux系统编程自学笔记-第四章:并发编程
    1、并行计算并行计算并行计算是一种计算方法,通过使用多个执行并行算法的处理器相较串行计算更快地解决问题。现代多核处理器的结构能很好的实现并行计算。计算机的发展未来也是并行计算。顺序算法与并行计算顺序算法一般代码块格式如下,顺序算法的每个代码块可能包含多......
  • Linux shell编程学习笔记16:bash中的关联数组
    上一节我们探讨了普通的数组,即使用数字下标来索引数组中不同的元素的数组,也可以称之为索引数组。相比纯粹的数字,字符串不仅能表明含义,也更便于记忆使用,于是就有了关联数组。一、关联数组概述bash从4.0开始支持关联数组,关联数组可以使用可以使用任意的字符串、或者整数作为下标来......
  • 【Elasticsearch】es脚本编程使用详解
    目录一、es脚本语言介绍1.1什么是es脚本1.2es脚本支持的语言1.3es脚本语言特点1.4es脚本使用场景二、环境准备2.1docker搭建es过程2.1.1拉取es镜像2.1.2启动容器2.1.3配置es参数2.1.4重启es容器并访问2.2docker搭建kibana过程2.2.1拉取kibana镜像2.2.2启动kibana容器2.......
  • 【程序员转型】从土木工程到 IT 编程,我的十年转型之路
    大家好,明天是1024        十年前,我还是一名土木工程专业的学生。那时的我,对于未来的职业方向感到迷茫和困惑。然而,在一次偶然的机会中,我接触到了IT编程,并深深地被这个领域所吸引。从那时起,我开始了我的转型之路。转行到IT编程职业并不是一件容易的事情。我需要学习新......
  • 第八周Linux教材第四章学习笔记——并发编程
     第四章 并发编程4.1并行计算导论在早期,大多数计算机只有一个处理组件,称为处理器或中央处理器(CPU)。受这种硬件条件的限制,计算机程序通常是为串行计算编写的。要求解某个问题,先要设计一种算法,描述如何一步步地解决问题,然后用计算机程序以串行指令流的形式实现该算法。在只有......
  • 一文彻底弄懂Linux-Shell编程
    一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式之间至少有一个空格[[测试表达式]]通过[[]]双中括......
  • 信息学奥赛一本通-编程启蒙-3414:【例71.3】 拼最大整数
    3414:【例71.3】拼最大整数http://bas.ssoier.cn:8086/problem_show.php?pid=3414【题目描述】设有n个正整数(n<20),将它们联接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213。又如:n=4时,4个整数7,13,4,46联接成的最大整数为:74......