MST

星途 面试题库

面试题:Python类装饰器专家难度面试题

设计一个通用的Python类装饰器,使其可以根据不同的配置动态地为类的方法添加不同的行为增强逻辑(例如,日志记录、性能监测、权限验证等)。装饰器接收一个配置字典作为参数,字典中键表示行为类型,值表示对应的配置参数。要求提供高度可复用、灵活且高效的实现方案,并对代码进行详细注释和说明。
29.9万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import functools
import time


# 日志记录函数
def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"调用函数 {func.__name__}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} 调用结束")
        return result

    return wrapper


# 性能监测函数
def monitor_performance(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 运行时间: {end_time - start_time} 秒")
        return result

    return wrapper


# 权限验证函数,这里简单示例为检查是否有权限
def check_permission(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # 简单模拟权限验证,这里假设权限为True就通过
        has_permission = True
        if has_permission:
            return func(*args, **kwargs)
        else:
            print("没有权限执行该操作")

    return wrapper


def behavior_enhancer(config):
    def decorator(cls):
        for attr_name, attr_value in cls.__dict__.items():
            if callable(attr_value):
                for behavior_type, behavior_config in config.items():
                    if behavior_type == 'log':
                        attr_value = log(attr_value)
                    elif behavior_type =='monitor':
                        attr_value = monitor_performance(attr_value)
                    elif behavior_type == 'permission':
                        attr_value = check_permission(attr_value)
                setattr(cls, attr_name, attr_value)
        return cls

    return decorator


代码说明:

  1. 导入必要的模块
    • import functools:用于保留被装饰函数的元信息(如函数名、文档字符串等)。
    • import time:用于性能监测功能中记录时间。
  2. 定义各个行为增强逻辑函数
    • log:日志记录函数,打印函数调用开始和结束的信息。
    • monitor_performance:性能监测函数,记录函数运行时间并打印。
    • check_permission:权限验证函数,简单模拟权限验证逻辑,有权限则执行函数,无权限则提示。
  3. 定义通用的类装饰器behavior_enhancer
    • 该装饰器接收一个配置字典config作为参数。
    • 内部定义decorator函数,该函数接收一个类cls
    • 遍历类的属性,对于每个可调用的属性(即方法),根据配置字典中的行为类型,依次应用相应的行为增强逻辑。
    • 最后返回增强后的类。

使用示例:

@behavior_enhancer({
    'log': None,
  'monitor': None,
    'permission': None
})
class MyClass:
    def my_method(self):
        print("执行 my_method")


my_obj = MyClass()
my_obj.my_method()


在上述示例中,MyClass类被behavior_enhancer装饰,配置字典指定了要应用日志记录、性能监测和权限验证三种行为增强逻辑。当调用my_obj.my_method()时,会依次执行这三种增强逻辑。