Python基础(⑥属性装饰器)
在 Python 中,属性装饰器(property decorator)是一种特殊的装饰器,用于将类中的方法转换为属性,让我们可以像访问普通属性一样调用方法,同时又能保持方法的封装性和逻辑处理能力。
最常用的属性装饰器是 @property
,它通常配合 @属性名.setter
和 @属性名.deleter
一起使用,分别用于处理属性的获取、设置和删除操作。
如果只定义 @property
而不定义 @xxx.setter
,则该属性会成为只读属性(无法被修改)。
class Person:def __init__(self, name, age):self._name = name # 用下划线表示这是一个"私有"属性self._age = age# 使用 @property 装饰器定义属性的获取方法@propertydef age(self):print("获取年龄")return self._age# 使用 @age.setter 装饰器定义属性的设置方法@age.setterdef age(self, value):print("设置年龄")if value < 0 or value > 120:raise ValueError("年龄必须在0到120之间")self._age = value# 使用 @age.deleter 装饰器定义属性的删除方法@age.deleterdef age(self):print("删除年龄属性")del self._age# 使用示例
p = Person("张三", 25)# 像访问普通属性一样获取值(实际上调用了 @property 装饰的方法)
print(p.age) # 输出: 获取年龄 25# 像设置普通属性一样设置值(实际上调用了 @age.setter 装饰的方法)
p.age = 30 # 输出: 设置年龄
print(p.age) # 输出: 获取年龄 30# 尝试设置无效值会触发异常
try:p.age = 150
except ValueError as e:print(e) # 输出: 年龄必须在0到120之间# 删除属性(实际上调用了 @age.deleter 装饰的方法)
del p.age # 输出: 删除年龄属性
自定义装饰器
*args, **kwargs
是什么?
这是 Python 中用于处理可变参数的语法,确保装饰器能适配任何参数的函数:
*args:接收所有位置参数,打包成一个元组(tuple)
**kwargs:接收所有关键字参数,打包成一个字典(dict)
示例理解:
def wrapper(*args, **kwargs):print("位置参数:", args) # 元组形式print("关键字参数:", kwargs) # 字典形式# 调用时传入各种参数
wrapper(1, 2, name="张三", age=20)
输出:
位置参数: (1, 2)
关键字参数: {'name': '张三', 'age': 20}
进阶代码
def my_decorator(func):# wrapper 接收任意参数def wrapper(*args, **kwargs):# 用 func.__name__ 获取函数名print(f"===== 调用函数:{func.__name__} =====")print(f"位置参数:{args}")print(f"关键字参数:{kwargs}")# 把参数传给原函数result = func(*args, **kwargs)print(f"返回结果:{result}")print("===== 函数调用结束 =====")return resultreturn wrapper# 测试不同参数的函数
@my_decorator
def add(a, b):return a + b@my_decorator
def greet(name, message="你好"):return f"{message},{name}!"# 调用测试
add(2, 3)
greet("张三", message="早上好")
123