当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/366025.html

相关文章:

  • 你只需输入一句话,MoneyPrinterTurbo直接给你输出一个视频
  • 普通人如何用 AI 提效?5 个低门槛工具 + 3 类场景案例,让 AI 成为日常助手
  • phpstorm 操作git 另外的操作在 我的收藏
  • c#编写的应用程序调用不在同一文件夹下的DLL
  • Java继承
  • c++ zint二维码、条形码开发库
  • c++多线程(1)------创建和管理线程td::thread
  • Python数据分析与处理(二):将数据写回.mat文件的不同方法【超详细】
  • AI+法律:用ERNIE-Bot解析合同条款,识别风险点
  • 进程管理和IPC
  • 常用假设检验方法及 Python 实现
  • 多层环境室内定位系统综述总结
  • 【JavaEE】(22) Spring 事务
  • 苏哒智能会议一体机:让会议管理进入智能时代
  • Java与Vue构建的企业设备资产管理系统,集成后台管理与移动端操作,覆盖设备全生命周期,支持采购、维护、报废等流程,提供完整源码,助力企业高效管控资产
  • 刻意练习实践说明使用手册
  • nginx配置讲解
  • GitLens:VS Code下高效解决代码追溯的Git管理实用插件
  • Spring Boot + Nacos 配置中心示例工程
  • ego(2)---初始轨迹生成后的关键点采样
  • 一文读懂线性回归的灵魂:成本函数 J(w,b) 全解析
  • K8s基于节点软亲和的高 CPU Pod 扩容与优先调度方案
  • 华为OD最新机试真题-二进制差异数-OD统一考试(C卷)
  • 《K8s网络策略与CNI插件交互问题分析:基于真实案例的排查方法》
  • 卷积操作原来分3种
  • (二)文件管理-基础命令-mkdir命令的使用
  • C++CSP-J/S必背模板
  • Estimating the Number of Sources: An Efficient Maximization Approach
  • 上下文记忆力媲美Genie3,且问世更早:港大和可灵提出场景一致的交互式视频世界模型!
  • Guidelines for using Adaptive Platform interfaces