Python 中的函数装饰器:理解 @property、Getter 和 Setter 方法

python 中的函数装饰器:理解 @property、getter 和 setter 方法

在面向对象编程中,封装是一个基本概念,对于确保数据完整性和向用户隐藏实现细节至关重要。 python 以其简单性和可读性而闻名,它采用 getter 和 setter 作为封装的一部分。本文深入探讨了 python 中 getter 和 setter 的目的和实现,深入了解它们在管理数据访问和维护对象完整性方面的作用。特别是,我们将探索 python 中的 @property 装饰器如何简化这些概念,从而允许使用更 pythonic 的方法来访问和更新对象属性。

封装和私有变量的重要性
封装的核心在于数据隐藏的思想——控制对对象内部状态的访问以防止意外干扰或误用。这需要使用私有变量。在许多编程语言中,私有变量用于确保对象内的敏感数据在未经适当授权的情况下无法直接访问或修改,从而保留给定对象的完整性。
python 不像其他一些语言那样具有严格的私有变量,而是使用在属性前添加单下划线 () 或双下划线 (_) 的约定,以表明它供内部使用。让我们来分解一下这两个约定之间的区别。

python 中的单下划线 (_) 与双下划线 (__)

a. 单下划线 (_):

变量开头的单个下划线(例如 _price)是一种约定,用于指示该属性供内部使用。 python 并未严格强制执行该属性,这意味着该属性仍然可以从类外部访问(即,它不是私有的)。但是,它向其他开发人员发出信号,表明该属性受到“保护”,除非必要,否则不应直接访问。例子:

class product:    def __init__(self, price):        self._price = price  # protected attribute (convention)product = product(10)print(product._price)  # accessing is possible, but discouraged

b. 双下划线 (__):

立即学习“Python免费学习笔记(深入)”;

变量开头的双下划线(例如 __price)会触发名称修改。名称修改在内部更改属性的名称,以防止从类外部意外访问或修改。这使得该属性更难直接访问,尽管它仍然不是完全私有的 – python 在内部通过在属性前面加上 _classname 来重命名该属性,使其只能通过其损坏的名称(例如 _product__price)进行访问。 例子:

class product:    def __init__(self, price):        self.__price = price  # name-mangled attributeproduct = product(10)# print(product.__price)  # this will raise an attributeerrorprint(product._product__price)  # accessing the mangled attribute

当您想要避免意外覆盖子类中的属性或想要针对意外的外部访问提供更强的保护时,它们非常有用。

为什么使用私有属性?
私有属性,尤其是那些用单下划线 (_) 表示的属性,对于维护封装非常重要。它们通过阻止外部代码直接与对象交互来保护对象的内部状态,这有助于:

保持数据完整性:私有属性可防止敏感或关键内部数据的意外修改。启用受控访问:通过使用 getter 和 setter 方法(或 @property 装饰器),对象控制如何以及何时访问或修改其属性,通常添加验证逻辑。提高可维护性:由于隐藏了内部细节,您可以修改底层实现而不影响类的外部行为。

传统的 getter 和 setter 方法
在许多编程语言中,getter 和 setter 用于提供对私有变量的受控访问。请参阅下面的示例:

class product:    def __init__(self, price):        self._price = price  # protected attribute    def get_price(self):        return self._price    def set_price(self, value):        if value >= 0:            self._price = value        else:            raise valueerror("price cannot be negative")product = product(10)print(product.get_price())  # 10product.set_price(20)print(product.get_price())  # 20

在此示例中,getter (get_price()) 和 set_price()) 提供了一种访问和修改 _price 属性的方法,同时执行某些规则(例如确保价格不为负)。

@property 装饰器
python 使用 @property 装饰器提供了一种更优雅的方式来管理对私有属性的访问。这个装饰器允许您定义行为类似于属性的方法,使代码更具可读性和python风格,同时仍然允许受控访问。

使用 @property 装饰器进行 getter 和 setter
下面是使用 @property 重构的前面的示例,以简化语法并提高可读性:

class Product:    def __init__(self, price):        self._price = price    @property    def price(self):        return self._price    @price.setter    def price(self, value):        if value >= 0:            self._price = value        else:            raise ValueError("Price cannot be negative")product = Product(10)print(product.price)  # 10product.price = 20print(product.price)  # 20

在此重构版本中:

@property装饰器允许我们像属性一样访问price(),即product.price,而不必调用像product.get_price()这样的getter方法。

@price.setter 装饰器启用设置价格值的逻辑,允许我们将其设置为 product.price = 20,同时仍然执行验证规则。

为什么使用@property?
@property 装饰器使您的代码更干净且更易于使用,特别是在处理私有属性时。原因如下:

可读性:它允许自然地访问属性,同时隐藏验证或转换的底层逻辑。封装:您可以强制执行如何访问或修改属性的规则,而无需暴露内部实现细节。灵活性:您可以在不更改外部接口的情况下重构内部行为,这意味着代码库的其余部分不会受到影响。

结论
封装是面向对象编程的基石,python 对私有变量的使用以及 @property 装饰器提供了一种干净灵活的方式来管理对对象内部状态的访问。带有单下划线 (_) 的属性表明它们供内部使用,而带有双下划线 (__) 的属性通过名称修改提供更强的保护。 @property 装饰器允许您以 pythonic 和可读的方式实现对这些私有属性的受控访问,确保数据完整性,同时保持干净的公共接口。

参考文献

关于属性的 python 文档

pep 318:函数装饰器

以上就是Python 中的函数装饰器:理解 @property、Getter 和 Setter 方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 13:44:05
下一篇 2025年12月13日 13:44:23

相关推荐

  • 好东西

    每周挑战 287 穆罕默德·s·安瓦尔 (mohammad s. anwar) 每周都会发出“每周挑战”,让我们所有人都有机会为每周两次的任务提出解决方案。我的解决方案首先用python编写,然后转换为perl。这对我们所有人来说都是练习编码的好方法。 挑战,我的解决方案 任务 1:强密码 任务 给…

    好文分享 2025年12月13日
    000
  • 怎么用python爬虫做网页

    是的,可以使用 Python 爬虫爬取网页。具体步骤包括:安装 Scrapy 框架创建一个 Scrapy 项目定义需要从中提取数据的网页地址编写一个解析器来提取数据运行爬虫以收集数据存储提取的数据 如何使用 Python 爬虫爬取网页 使用 Python 爬虫爬取网页是一个获取网页内容的有效方法,用…

    2025年12月13日
    000
  • 怎么说python爬虫强大呢

    Python 爬虫的强大之处体现在以下方面:可扩展性,可轻松处理大量数据;跨平台兼容性,可在多种操作系统运行;丰富的生态系统,提供众多库和框架;易于学习,语法简单直观;多线程和异步支持,提高爬取速度;高性能,高效获取和解析网页;易于定制,满足特定需求;社区支持,提供丰富资源和支持。 Python 爬…

    2025年12月13日
    000
  • python爬虫怎么导入bs4

    要导入 BeautifulSoup4,请遵循以下步骤:使用 pip 进行安装:pip install beautifulsoup4导入 bs4 模块:from bs4 import BeautifulSoup创建 BeautifulSoup 对象:soup = BeautifulSoup(html_…

    2025年12月13日
    000
  • python爬虫怎么构建代理池

    构建 Python 代理池可通过以下步骤:收集代理,验证可用性,管理代理池,轮询代理,更新代理池,监控代理池。以确保爬虫绕过反爬机制,提升爬虫效率。 Python构建代理池 构建有效的代理池对于爬虫任务至关重要,因为它可以绕过网站反爬或提升爬虫效率。在Python中构建代理池的方法如下: 一、收集代…

    2025年12月13日
    000
  • 使用 Python 抓取佐治亚州亚特兰大律师数据的技术指南

    在本指南中,我们将探讨如何使用 python 从法律网站上抓取律师数据,重点关注佐治亚州亚特兰大的律师。这些信息对于那些想要寻找律师、研究律师事务所或收集附近律师数据的人来说非常有价值。我们将使用流行的 python 库创建一个强大的抓取工具,可以帮助您收集亚特兰大地区律师的信息。 先决条件在我们开…

    2025年12月13日
    000
  • 自学 Python 并找到梦想工作的最佳方式

    如果您决心在科技领域找到梦想的工作,学习 Python 是实现这一目标的最有效方法之一。 Python的多功能性和易学性使其成为想要进入该行业的自学者的首选。但自学 Python 的最佳方法是什么?面对如此多的可用资源和策略,选择正确的方法可能会让人感到不知所措。 本指南将引导您了解自学 Pytho…

    2025年12月13日
    000
  • PSD 批量编辑器

    大家好!我正在分享我在过去几个月开发的这个新软件。 我希望它可以帮助一些人,并且有些人可能有兴趣帮助我改进它。我想添加很多功能,请随时告诉我您希望在软件中看到什么。 在技术方面,我开始这个项目是为了尝试在我的代码中实现一些设计模式,并更好地构建架构。这也是我第一次使用QT(我在过去的GUI项目中使用…

    2025年12月13日
    000
  • 使用 Python 自动发送生日电子邮件

    在科技时代,自动化已成为一项基本技能,使我们能够简化重复性任务并提高生产力。自动化真正发挥作用的一个领域是电子邮件管理。作为一名渴望提高技能的 python 学习者,我最近开始了一个自动化生日电子邮件的项目。这个项目不仅为我提供了实践经验,还加强了python在日常任务中的实际应用。 灵感 这个项目…

    2025年12月13日
    000
  • 在 Windows 上使用 WSL2 将 Polars 与 NVIDIA GPU (CUDA) 结合使用

    首先,如果我错过了什么,或者做错了什么,或者如果您有疑问 ,请告诉我 步骤 wsl2 通过 window 商店安装任何 linux 发行版(例如 ubuntu 22.04)启动并创建用户通过在命令提示符或 powershell(在 windows 设备上)中运行此命令将 wsl 版本 2 设置为默认…

    2025年12月13日
    000
  • HandyHub – 您的首选商人目录

    HandyHub:将客户与可靠的商人联系起来 项目目的 HandyHub 旨在弥合客户与所在领域熟练商人之间的差距。我们的目标是简化寻找和雇用技工的流程,使客户更容易通过用户友好的平台获得管道、电气工作和维修等基本服务。 团队成员、角色和时间表 HandyHub项目是ALX SE计划最终项目的一部分…

    2025年12月13日
    000
  • 首次合作!

    在本周的实验中,我们的任务是通过 GitHub 为其他人的工作做出贡献。我们需要做的是在他们的项目中添加一个输出代币信息的新功能,并且我们需要使用命令行标志来触发该功能。 她的项目正在使用 OpenAI 为源代码创建自述文件。 第一个想法。 关于合作另一项工作,我的第一个想法是我需要学习他们的编码风…

    2025年12月13日
    000
  • 我的第一个开源贡献

    提交问题 对于我的第一个贡献,我提交了一个问题以向另一个项目添加新功能,即添加一个新的标志选项来显示用于提示和完成生成的令牌。 功能:聊天完成令牌信息标志选项 #8 克莱布恩特拉 发布于 2024 年 9 月 16 日 描述 一个标志选项,为用户提供发送和接收的令牌计数。我认为这是一个重要的功能,可…

    2025年12月13日 好文分享
    000
  • 学习编码的顶级人工智能工具:有抱负的开发人员的游戏规则改变者

    AI 编码工具、学习编码的最佳 AI 工具、GitHub Copilot、Kite、OpenAI 的 Codex、编码助手、学习编码 AI 工具、初学者编码工具、AI 驱动的编码平台、面向开发人员的 AI 工具。 在当今快节奏的科技世界中,学习如何编码变得比以往任何时候都更加重要。无论您是想转行、增…

    2025年12月13日
    000
  • 了解Python的heapq模块

    在python中,堆是一个强大的工具,可以有效地管理元素集合,在这些元素集合中,您经常需要快速访问最小(或最大)的项目。 python中的heapq模块提供了堆队列算法的实现,也称为优先级队列算法。 本指南将解释堆的基础知识以及如何使用 heapq 模块,并提供一些实际示例。 什么是堆? 堆是一种特…

    2025年12月13日
    000
  • 阿毛老师python爬虫课怎么样

    阿毛老师的 Python 爬虫课非常值得推荐,适合初学者和想要深入学习爬虫的学生。课程内容全面涵盖了 Python 爬虫技术的全套知识,包括 Python 基础、HTTP 协议、HTML 和 XML 解析、正则表达式、requests 和 beautifulsoup 库的使用、数据持久化和可视化。阿…

    2025年12月13日
    000
  • python爬虫键值为空怎么改

    处理Python爬虫中键值为空的方法包括:使用默认值使用lambda函数使用try-except语句使用None Python爬虫中,如何处理键值为空的情况 在使用Python爬虫时,有时会遇到键值为空的情况。这可能是由于页面上没有相关数据,或者是页面结构发生了变化。如果不进行处理,可能会导致程序出…

    2025年12月13日
    000
  • python爬虫怎么爬取电影评论

    可使用 Python 爬取电影评论,具体步骤包括:安装 requests 和 BeautifulSoup 库,获取电影页面 HTML,解析 HTML 提取评论,存储评论到文件或数据库。 用 Python 爬取电影评论 如何用 Python 爬取电影评论? 要使用 Python 爬取电影评论,可以遵循…

    2025年12月13日
    000
  • python爬虫运行时怎么办

    Python爬虫运行时常见错误解决方法:ImportError:确保已安装模块并设置正确路径。AttributeError:验证模块属性是否存在,确保导入正确版本。ConnectionError:检查服务器可用性、代理有效性和请求间隔。TimeoutError:增加超时时间、使用重试机制和优化请求频…

    2025年12月13日
    000
  • 安卓怎么调用python写的爬虫

    在安卓设备上调用 Python 爬虫时,需要使用 SL4A 作为桥梁。具体步骤包括:1. 安装 SL4A;2. 创建 Python 爬虫脚本;3. 将脚本转换为 SL4A 模块;4. 在安卓应用程序中加载模块;5. 调用模块中的方法执行爬虫任务。 安卓调用 Python 爬虫 如何调用 在安卓设备上…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信