天天看點

python反射實作django中間件類似的配置小demo

1、建立一個python包

python反射實作django中間件類似的配置小demo

 2、包裡面每個檔案内容

<1> email.py裡面

class Email(object):

    def send(self, content):
        print("郵件消息:{}".format(content))


<2> qq.py裡面

class QQ(object):

    def send(self, content):
        print("QQ消息:{}".format(content))


<3> we_chat.py裡面

class WeChat(object):

    def send(self, content):
        print("微信消息:{}".format(content))
           

3、包的同級目錄增加配置檔案、和增加主程式py檔案

python反射實作django中間件類似的配置小demo
<1> reflect_settings.py 檔案裡面

# 類似django中間件的配置,注釋了就不再生效
SEND_MESSAGE_SETTINGS = [
    "reflect2.we_chat.WeChat",
    "reflect2.qq.QQ",
    "reflect2.email.Email"
]

<2> reflect_send_message.py 檔案裡面


import importlib
from reflect_settings import SEND_MESSAGE_SETTINGS


# 模拟群發消息
def send_message(content):
    for i in SEND_MESSAGE_SETTINGS:
        path, cla = i.rsplit('.', 1)
        path = importlib.import_module(path)
        # path = __import__(path, fromlist=(cla,))
        class_obj = getattr(path, cla)
        instance_obj = class_obj()
        instance_obj.send(content)


if __name__ == '__main__':
    send_message("今天發獎金!")
           

列印結果:

python反射實作django中間件類似的配置小demo

4、如果再加釘釘發消息,直接再包裡面建立dingding.py 。同時也實作send方法,然後在配置檔案加一行配置

python反射實作django中間件類似的配置小demo
SEND_MESSAGE_SETTINGS = [
    "reflect2.we_chat.WeChat",
    "reflect2.qq.QQ",
    "reflect2.email.Email",
    "reflect2.dingding.DingDing",
]
           

5、運作 reflect_send_message.py 檔案

效果:

python反射實作django中間件類似的配置小demo

 這樣就實作了,動态的去調用對象方法