MST

星途 面试题库

面试题:Python类装饰器高级难度面试题

假设你有一个类层次结构,基类有多个方法。编写一个类装饰器,它能够在子类继承基类后,自动为子类的特定方法(比如所有以'process_'开头的方法)添加事务处理功能(简单模拟事务,在方法执行前打印'开始事务',执行后打印'结束事务')。请详细说明实现思路并给出代码示例。
29.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义一个类装饰器函数,该函数接受一个类作为参数。
  2. 在装饰器函数内部,遍历类的属性,找到所有以process_开头的方法。
  3. 使用functools.wraps来保留原方法的元信息(如函数名、文档字符串等),为这些方法创建新的包装函数,在包装函数中添加事务处理逻辑(打印'开始事务'和'结束事务')。
  4. 将原方法替换为包装后的方法。
  5. 返回修改后的类。

代码示例

import functools


def transaction_decorator(cls):
    for name, method in cls.__dict__.items():
        if callable(method) and name.startswith('process_'):
            @functools.wraps(method)
            def wrapper(*args, **kwargs):
                print('开始事务')
                result = method(*args, **kwargs)
                print('结束事务')
                return result
            setattr(cls, name, wrapper)
    return cls


class BaseClass:
    def process_data(self):
        print('处理数据')


@transaction_decorator
class SubClass(BaseClass):
    pass


sub = SubClass()
sub.process_data()