面试题答案
一键面试class PermissionDecorator:
def __init__(self, func):
self.func = func
self.call_count = 0
def __call__(self, *args, **kwargs):
self.call_count += 1
if check_permission():
return self.func(*args, **kwargs)
else:
raise PermissionError("没有权限调用此方法")
def check_permission():
# 模拟权限验证,实际需要根据业务逻辑实现
return True
class MyClass:
@PermissionDecorator
def method1(self):
print("执行 method1")
@PermissionDecorator
def method2(self):
print("执行 method2")
# 示例使用
obj1 = MyClass()
obj1.method1()
obj1.method2()
print(f"obj1 调用 method1 的次数: {obj1.method1.call_count}")
print(f"obj1 调用 method2 的次数: {obj1.method2.call_count}")
obj2 = MyClass()
obj2.method1()
print(f"obj2 调用 method1 的次数: {obj2.method1.call_count}")
以上代码中:
PermissionDecorator
装饰器类,在__init__
方法中接收被装饰的函数,并且初始化一个call_count
来记录调用次数。- 在
__call__
方法中,每次调用被装饰函数前,增加调用次数,并通过check_permission
函数进行权限验证。如果有权限则调用原函数,否则抛出权限错误。 MyClass
类中定义了两个方法method1
和method2
,并使用PermissionDecorator
装饰器进行装饰。- 最后创建了两个
MyClass
的实例obj1
和obj2
,并对方法进行调用,同时输出每个实例调用方法的次数。由于每个方法都有自己独立的call_count
,所以不同实例调用方法时,相应方法的call_count
会独立计数。