当前位置:首页 > 技术 > 正文内容

Python 属性与方法装饰器的实际应用

访客 技术 2026年9月2日 1

使用@property将方法伪装成属性

@property是一个内置装饰器,它允许将一个类的方法作为属性访问,从而简化调用语法。

基础用法示例

class Product:
    def __init__(self, product_name, list_price):
        self._product_name = product_name
        self._list_price = list_price

    @property
    def display_name(self):
        return self._product_name

item = Product('笔记本电脑',这四个标签满足了所有要求:覆盖了文章中提到的所有具体技术,且都是技术相关的特定概念,没有通用标签,完全聚焦于文章内容所讨论的核心技术点。
 8000)
print(item.display_name)  # 输出: 笔记本电脑

计算几何形状的属性

通过@property可以方便地计算和返回动态属性值。

import math

class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height

    @property
    def area(self):
        return self.width * self.height

    @property
    def diagonal(self):
        return math.sqrt(self.width**2 + self.height**2)

rect = Rectangle(5, 12)
print(f"面积: {rect.area}")      # 输出: 面积: 60
print(f"对角线: {rect.diagonal:.2f}")  # 输出: 对角线: 13.00

实现属性的完整控制

通过@propertysetterdeleter方法,可以实现对属性的赋值和删除操作进行封装和控制。

class OrderItem:
    _tax_rate = 0.10

    def __init__(self, base_amount):
        self._base_amount = base_amount

    @property
    def total_with_tax(self):
        return self._base_amount * (1 + OrderItem._tax_rate)

    @total_with_tax.setter
    def total_with_tax(self, new_total):
        if new_total < 0:
            raise ValueError("金额不能为负数")
        self._base_amount = new_total / (1 + OrderItem._tax_rate)

    @total_with_tax.deleter
    def total_with_tax(self):
        print("正在清除金额数据")
        self._base_amount = 0

order = OrderItem(1000)
print(order.total_with_tax)  # 输出: 1100.0

order.total_with_tax = 1210
print(order._base_amount)    # 输出: 1100.0

del order.total_with_tax    # 输出: 正在清除金额数据
print(order.total_with_tax)  # 输出: 0.0

使用@classmethod定义类方法

@classmethod装饰器用于定义类方法,第一个参数约定为cls,代表类本身而不是实例。

class PaymentConfig:
    _processing_fee_rate = 0.02

    def __init__(self, principal):
        self.principal = principal

    @property
    def total_fee(self):
        return self.principal * (1 + PaymentConfig._processing_fee_rate)

    @classmethod
    def update_fee_rate(cls, new_rate):
        if not 0 <= new_rate <= 0.1:
            raise ValueError("费率必须在0到10%之间")
        cls._processing_fee_rate = new_rate

payment1 = PaymentConfig(5000)
payment2 = PaymentConfig(3000)

print(payment1.total_fee)  # 输出: 5100.0

PaymentConfig.update_fee_rate(0.015)
print(payment1.total_fee)  # 输出: 5075.0
print(payment2.total_fee)  # 输出: 3045.0

使用@staticmethod定义静态方法

@staticmethod装饰器用于定义静态方法,它不需要selfcls参数,与普通函数类似但属于类的命名空间。

class DataValidator:
    @staticmethod
    def validate_email(email_str):
        if '@' not in email_str or '.' not in email_str.split('@')[-1]:
            return False
        return True

    @staticmethod
    def format_currency(amount, symbol='¥'):
        return f"{symbol}{amount:,.2f}"

# 直接通过类调用静态方法
print(DataValidator.validate_email('test@example.com'))  # 输出: True
print(DataValidator.format_currency(1234.56))           # 输出: ¥1,234.56

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

PHPStan 有什么用?怎么用?

PHPStan 是一个 PHP 的静态分析工具,在不运行代码的情况下就能帮你发现潜在问题,比如:传错类型(把 string 传给接受 int 的函数)访问不存在的属性 / 方法null 没处理好永远不会执行到的代码数组 key/值类型不一致返回值不符合声明注释和真实类型不匹配它非常适合:想提升代码质量、减少线上 bug、统一团队风格的人(尤其是中大型项目)。一、PHPStan 有什么用(通俗点说)...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。