全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-19 10 分钟 ✍️ juanwangdev

Python 注册型装饰器

注册型装饰器自动收集函数,实现插件机制和解耦设计。

基本注册模式

Python
# 注册到字典
registry = {}

def register(func):
    registry[func.__name__] = func
    return func  # 返回原函数,不修改行为

@register
def handler_a():
    return "Handler A"

@register
def handler_b():
    return "Handler B"

print(registry)  # {'handler_a': <func>, 'handler_b': <func>}
print(registry['handler_a']())  # Handler A

命令注册示例

Python
commands = {}

def command(name):
    def decorator(func):
        commands[name] = func
        return func
    return decorator

@command('greet')
def greet_command(name):
    print(f"Hello, {name}")

@command('quit')
def quit_command():
    print("Goodbye")

# 调用注册的命令
commands['greet']('Alice')
commands['quit']()

路由注册模式

Python
routes = {}

def route(path):
    def decorator(func):
        routes[path] = func
        return func
    return decorator

@route('/')
def home():
    return "Home Page"

@route('/about')
def about():
    return "About Page"

@route('/users/<int:id>')
def user(id):
    return f"User {id}"

# 路由分发
def dispatch(path):
    handler = routes.get(path)
    if handler:
        return handler()
    return "404 Not Found"

print(dispatch('/'))      # Home Page
print(dispatch('/about')) # About Page

事件处理注册

Python
handlers = {}

def on(event_type):
    def decorator(func):
        if event_type not in handlers:
            handlers[event_type] = []
        handlers[event_type].append(func)
        return func
    return decorator

@on('click')
def handle_click():
    print("处理点击事件")

@on('click')
def log_click():
    print("记录点击日志")

@on('submit')
def handle_submit():
    print("处理提交事件")

# 触发事件
def emit(event_type):
    for handler in handlers.get(event_type, []):
        handler()

emit('click')
# 输出:
# 处理点击事件
# 记录点击日志

插件系统实现

Python
plugins = {}

def plugin(name):
    def decorator(cls):
        plugins[name] = cls
        return cls
    return decorator

@plugin('image')
class ImagePlugin:
    def process(self, file):
        return f"处理图片: {file}"

@plugin('video')
class VideoPlugin:
    def process(self, file):
        return f"处理视频: {file}"

# 动态加载插件
def get_plugin(name):
    return plugins.get(name)

processor = get_plugin('image')
print(processor().process('test.jpg'))

类注册模式

Python
class Registry:
    _registry = {}

    @classmethod
    def register(cls, name):
        def decorator(func):
            cls._registry[name] = func
            return func
        return decorator

    @classmethod
    def get(cls, name):
        return cls._registry.get(name)

@Registry.register('create')
def create_item():
    return "创建项目"

@Registry.register('delete')
def delete_item():
    return "删除项目"

print(Registry.get('create')())  # 创建项目

条件注册

Python
handlers = {}

def register_if(condition):
    def decorator(func):
        if condition:
            handlers[func.__name__] = func
        return func
    return decorator

enabled = True

@register_if(enabled)
def handler_a():
    pass

@register_if(False)  # 不注册
def handler_b():
    pass

print(handlers)  # {'handler_a': <func>}

自动注册基类

Python
class AutoRegistered:
    registry = {}

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        AutoRegistered.registry[cls.__name__] = cls

class HandlerA(AutoRegistered):
    def handle(self):
        return "Handler A"

class HandlerB(AutoRegistered):
    def handle(self):
        return "Handler B"

print(AutoRegistered.registry)
# {'HandlerA': <class HandlerA>, 'HandlerB': <class HandlerB>}

注册器清理

Python
class CleanRegistry:
    _registry = {}

    @classmethod
    def register(cls, name):
        def decorator(func):
            cls._registry[name] = func
            return func
        return decorator

    @classmethod
    def clear(cls):
        cls._registry.clear()

    @classmethod
    def unregister(cls, name):
        cls._registry.pop(name, None)

@CleanRegistry.register('handler')
def handler():
    pass

CleanRegistry.unregister('handler')
CleanRegistry.clear()

注册模式应用

应用场景说明
命令系统注册命令处理函数
路由系统注册 URL 处理函数
事件系统注册事件监听器
插件系统注册插件类
策略模式注册策略实现
工厂模式注册产品类型

要点总结

  • 注册型装饰器将函数存入字典或列表
  • 返回原函数,不修改函数行为
  • 支持参数化的注册名称
  • 多个函数可注册到同一事件类型
  • 类注册使用 __init_subclass__
  • 实现插件机制、路由系统、事件处理
  • 解耦函数定义和调用逻辑
  • 注册型装饰器是灵活的设计模式

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python 迭代器协议
下一篇 → Python 状态保持装饰器
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库