Python 的反射应用

import sys  # 导入sys模块,用于获取当前模块信息

# 定义一个函数get_test,接受一个参数name,类型为str,带有注解"姓名",并且为必填参数
def get_test(name: Annotated[str, "姓名", True]):
    return f"你好,{name}!"  # 返回一个拼接了参数name的字符串

if __name__ == '__main__':
    # 获取当前模块的引用,用于访问当前模块中定义的函数、变量等
    function_path = sys.modules[__name__]

    function_name = "get_test"  # 函数名为"get_test"
    function_arguments = {"name": "张三"}  # 函数调用时的参数,包含一个name参数,值为"张三"

    # 使用getattr函数通过模块路径和函数名获取函数对象,如果不存在则返回None
    function = getattr(function_path, function_name, None)

    # 调用获取到的函数,并传入参数
    result = function(**function_arguments)

    # 打印函数调用的结果
    print(result)




Python 的扫描应用

目录结构:

.
├─ extends
│   ├─ extend_1.py
│   ├─ extend_2.py
│   ├─ extend_3.py
│   └─ __init__.py
└─ app.py

extend_1.py:

def show(p1, p2):
    print(f'extend_1 = {p1, p2}')

extend_2.py:

def show(p1, p2):
    print(f'extend_2 = {p1, p2}')

extend_3.py:

def show(p1, p2):
    print(f'extend_3 = {p1, p2}')

app.py:

import os
import glob

# 切换工作目录为当前目录
os.chdir(os.path.dirname(__file__))

# 动态加载所有以 extend_ 开头的模块
module_pool = []
for module_file in glob.glob('extends/extend_*.py'):
    module_name = os.path.splitext(os.path.basename(module_file))[0]
    module = __import__(f'extends.{module_name}', fromlist=[''])
    module_pool.append(module)

# 测试动态扩展组件写法
if __name__ == '__main__':
    # 读取池中所有的模块
    for module in module_pool:
        # 使用直接调用函数的方式执行 show(p1, p2) 函数
        module.show('参数1', '参数2')

运行示例:

python app.py

运行后应该会输出类似以下结果:

extend_1 = ('参数1', '参数2')
extend_2 = ('参数1', '参数2')
extend_3 = ('参数1', '参数2')

这段代码会动态加载所有以 extend_ 开头的模块,并依次调用每个模块中的 show() 函数,输出相应的结果。




分类: Python

毛巳煜

高级软件开发全栈架构师

工信部备案号:辽ICP备17016257号-2