面试题答案
一键面试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
代码说明:
- 导入必要的模块:
import functools
:用于保留被装饰函数的元信息(如函数名、文档字符串等)。import time
:用于性能监测功能中记录时间。
- 定义各个行为增强逻辑函数:
log
:日志记录函数,打印函数调用开始和结束的信息。monitor_performance
:性能监测函数,记录函数运行时间并打印。check_permission
:权限验证函数,简单模拟权限验证逻辑,有权限则执行函数,无权限则提示。
- 定义通用的类装饰器
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()
时,会依次执行这三种增强逻辑。