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

python装饰器property的使用

使用 Python 的 @property 装饰器管理类属性

在 Python 中,@property 装饰器是一个非常有用的工具,它允许我们将一个方法转换为属性调用。这样,我们就可以像访问对象的属性一样来调用该方法,而不需要使用括号。这通常用于封装数据,使得代码更加清晰和易于维护。

使用 @property 的好处

  1. 封装:可以隐藏对象内部的数据,防止外部直接修改。
  2. 接口一致性:即使内部实现改变,外部调用方式保持不变。
  3. 增加控制:可以在获取或设置属性值时加入逻辑判断。

基本用法

假设我们有一个 Person 类,其中包含一个属性 age,我们希望对这个属性的读取和写入进行一些额外的处理。

示例代码

class Person:
    def __init__(self, name, age):
        self._name = name
        # 使用 setter 方法初始化 age 属性
        self.age = age

    @property
    def age(self):
        """获取年龄"""
        print(f"Getting age for {self._name}")
        return self._age

    @age.setter
    def age(self, value):
        """设置年龄"""
        print(f"Setting age for {self._name} to {value}")
        if not isinstance(value, int):
            raise ValueError("Age must be an integer.")
        if value < 0:
            raise ValueError("Age cannot be negative.")
        self._age = value

    @age.deleter
    def age(self):
        """删除年龄"""
        print(f"Deleting age for {self._name}")
        del self._age

# 创建一个 Person 对象
person = Person("Alice", 30)

# 访问 age 属性
print(person.age)  # 输出: Getting age for Alice
                   #       30

# 修改 age 属性
person.age = 35  # 输出: Setting age for Alice to 35
print(person.age)  # 输出: Getting age for Alice
                   #       35

# 尝试设置一个无效的 age 值
try:
    person.age = -5
except ValueError as e:
    print(e)  # 输出: Age cannot be negative.

# 删除 age 属性
del person.age  # 输出: Deleting age for Alice

# 尝试访问已删除的 age 属性
try:
    print(person.age)
except AttributeError as e:
    print(e)  # 输出: 'Person' object has no attribute '_age'

初始化:
在 __init__ 方法中,我们使用 self.age = age 来初始化 age 属性。这里实际上是调用了 @age.setter 方法,确保了初始值的有效性。
访问属性:
@property 装饰器将 age 方法转换为一个属性,因此可以通过 person.age 直接访问 age 属性。每次访问时,都会打印一条消息,显示正在获取年龄。
设置属性:
@age.setter 装饰器定义了设置 age 属性的方法。在设置新值之前,会进行类型检查和值检查,确保 age 是一个非负整数。
删除属性:
@age.deleter 装饰器定义了删除 age 属性的方法。调用 del person.age 会删除 _age 属性,并打印一条消息。

http://www.kler.cn/news/362468.html

相关文章:

  • S32DS for ARM GPIO实践
  • 文通车牌识别相机在工地称重应用中的卓越表现
  • 【Verilog】CRC-24
  • 2k1000LA 开机自动登录, 非root 用户
  • 模拟退火算法:原理与Python实现
  • SpringBoot实现的汽车票在线预订系统
  • 详细说明如何使用C++编写A*算法
  • 算法笔记day05
  • 面试总结分享:25道数据库测试题
  • HCIP-HarmonyOS Application Developer 习题(十)
  • 关于风险系统解读最全最专业文章:一篇文章讲透风险,跨学科搞懂风险游戏规则,风险信任风险主观性客观性风险本质人格特质与风险态度技术风险系统风险社会新产品风险
  • Flutter 中的 PopScope 小部件:全面指南
  • 阿里巴巴最新版Spring Security OAuth2.0认证授权笔记开源
  • 拼三角问题
  • 三菱FX5U PLC程序容量设置
  • vue-router钩子中调用ElMessage等样式出错
  • curl,nc和telnet的用法以及其他常用工具(nc代理与重定向)
  • MySQL - Navicat自动备份MySQL数据
  • JVM-编译期处理与Java语法糖
  • 如何在 HarmonyOS NEXT 中使用 @Builder 装饰器优化 UI 组件的复用?
  • 金仓数据库×武汉人社:共塑大数据应用智慧平台
  • 论文阅读_大型语言模型增强强化学习调查
  • 使用QueryWrapper中IN关键字超过1000个参数后如何处理
  • Redis的Bin目录文件及常用命令
  • mapping source must be pairs of fieldnames and properties definition 解决方案
  • 桥接、NAT和仅主机三种网络模式对虚拟机IP地址分配的影响