You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用装饰器实现Python类的protected和private访问修饰符?

用装饰器实现Python的protected和private访问修饰符

能否实现?

可以通过装饰器结合调用栈检查,实现符合需求的protected和private访问控制效果。

具体实现代码

利用inspect模块获取调用栈,判断调用是否来自类内部,以此控制方法的访问权限:

import inspect
import warnings

def protected(func):
    def wrapper(self, *args, **kwargs):
        stack = inspect.stack()
        caller_frame = stack[2]
        try:
            # 检查调用者是否来自类内部实例
            caller_self = caller_frame.f_locals.get('self')
            if caller_self is None or not isinstance(caller_self, self.__class__):
                warnings.warn(f"警告:正在从类外部访问受保护方法 {func.__name__}", UserWarning)
            return func(self, *args, **kwargs)
        finally:
            del stack  # 清理栈避免内存泄漏
    return wrapper

def private(func):
    def wrapper(self, *args, **kwargs):
        stack = inspect.stack()
        caller_frame = stack[2]
        try:
            caller_self = caller_frame.f_locals.get('self')
            if caller_self is None or not isinstance(caller_self, self.__class__):
                raise PermissionError(f"错误:无法从类外部访问私有方法 {func.__name__}")
            return func(self, *args, **kwargs)
        finally:
            del stack
    return wrapper

# 测试类
class A:
    def public_func(self):
        self.protected_func()    # 类内部调用,无警告错误
        self.private_func()      # 类内部调用,无警告错误
    
    @protected
    def protected_func(self):
        print('protected is running')
        self.private_func()      # 类内部调用,无警告错误
    
    @private
    def private_func(self):
        print(f'private is running')

# 测试执行
a = A()
a.public_func()      # 正常执行,无警告错误
a.protected_func()   # 输出警告信息后执行
a.private_func()     # 直接抛出PermissionError异常

能否解决原生私有方法的问题?

这个思路完全可以解决原生__name名称修饰的局限性:

  • 原生私有方法通过名称修饰(如__private_func变为_A__private_func),外部仍可通过修改后的名称直接访问,并非真正意义上的私有。
  • 装饰器实现的private方法,不会修改原方法名称,也不会生成_Class__func这类衍生名称。外部直接调用时,装饰器会检查调用上下文,直接抛出异常阻止访问,从调用层面实现了真正的私有控制(除非通过反射强行绕过,但反射本身就是突破访问限制的手段,不属于常规访问场景)。

内容的提问来源于stack exchange,提问作者Ehsan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:57:30