Python 装饰器泛化公有和私有属性访问控制
引言
Python 装饰器是一种强大的功能,允许程序员在不修改函数或类本身的情况下,动态地添加额外的功能或修改其行为。这种机制为代码提供了极高的灵活性和可扩展性,广泛应用于日志记录、性能分析、权限验证及属性访问控制等场景。
在面向对象编程中,类的属性访问控制是保障数据安全与逻辑完整性的核心概念。虽然 Python 通过单下划线(_)和双下划线(__)前缀来区分公有属性和私有属性,但默认的访问控制往往不够灵活。有时我们需要对属性的读取和写入进行统一的监控、日志记录或强制校验,这就是泛化公有和私有属性访问的需求。
本文将深入探讨如何利用装饰器结合 Python 的属性协议(Attribute Protocol),实现对类中公有和私有属性的深度定制与管控。
Python 装饰器的基础概念
装饰器本质上是一个高阶函数,它接收一个函数或类作为参数,并返回一个新的可调用对象。通过 @decorator 语法糖,我们可以将装饰器应用于目标对象。
基础函数装饰器示例
def my_decorator(func):
def wrapper(*args, **kwargs):
print("在调用函数之前执行的代码")
result = func(*args, **kwargs)
print("在调用函数之后执行的代码")
return result
return wrapper
@my_decorator
def say_hello(name):
print(f"Hello, {name}!")
say_hello("World")
上述示例中,my_decorator 捕获了 say_hello 的调用过程。运行 say_hello() 时,首先执行包装器中的前置逻辑,然后才执行原函数,最后执行后置逻辑。这一模式可以扩展到类装饰器,从而修改整个类的行为。
类装饰器与属性访问协议
要泛化属性访问,我们需要利用 Python 的数据模型方法,特别是 __getattribute__、__getattr__、__setattr__ 和 __delattr__。
__getattribute__(self, name): 当访问任何属性时被调用。如果该方法抛出 AttributeError,解释器会尝试调用__getattr__。__getattr__(self, name): 仅在属性查找失败且未定义__getattribute__处理该属性时调用。__setattr__(self, name, value): 当设置任何属性值时被调用。__delattr__(self, name): 当删除属性时被调用。


