MST

星途 面试题库

面试题:Python装饰器在类方法中的复杂应用

假设有一个类,类中有多个方法,现在需要用装饰器来实现对每个方法的调用进行权限验证(假设权限验证函数为`check_permission`,返回True或False表示是否有权限),并且要考虑如何在类的不同实例中共享权限验证的状态,例如记录每个实例调用方法的总次数。请编写完整的类定义以及装饰器代码实现此功能。
12.7万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
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}")

以上代码中:

  1. PermissionDecorator 装饰器类,在 __init__ 方法中接收被装饰的函数,并且初始化一个 call_count 来记录调用次数。
  2. __call__ 方法中,每次调用被装饰函数前,增加调用次数,并通过 check_permission 函数进行权限验证。如果有权限则调用原函数,否则抛出权限错误。
  3. MyClass 类中定义了两个方法 method1method2,并使用 PermissionDecorator 装饰器进行装饰。
  4. 最后创建了两个 MyClass 的实例 obj1obj2,并对方法进行调用,同时输出每个实例调用方法的次数。由于每个方法都有自己独立的 call_count,所以不同实例调用方法时,相应方法的 call_count 会独立计数。